2011-06-22 64 views
2

我使用T4模板很多,但只適用於基於文本的文件(畢竟T代表文本)。我可以使用T4將原始字節寫入輸出嗎?

但是,我現在有一個場景,它將有利於在圖像上使用它 - 讀取圖像,做一些事情,寫回來。 (如果可能的話,我想避免msbuild-tasks或postbuild應用程序,因爲T4很好地集成到Visual Studio和源代碼控制中)。

但是,即使在設置<#@ output extension=".png" encoding="ASCII" #>時,生成的文件中也沒有確切的字節,這可能是因爲將字節轉換爲字符或字符串會導致轉換,從而改變它。

有沒有辦法做到這一點?我不想做File.WriteAllBytes,因爲這樣不能很好地與源代碼控制一起工作。

回答

1

文本模板始終會生成一個字符串(您可以在創建預處理文本模板時在代碼後面的文件中看到此內容)。它生成一些將連接字符串的代碼。除非您創建自己的解析方法,否則無法將文本模板用於生成文本文件之外的用途。

3

我們的T4模板都有一個共同的基類(<#@ template language="C#" inherits="MySpecialBaseForT4s"...)。我們爲該基類添加了一個WriteBinary(byte[] data)受保護的方法,從而允許我們的T4模板生成一個zip文件並將其傳遞給調用CompiledTemplate.Process()方法的系統部分。

public abstract class MySpecialBaseForT4s: TextTransformation 
{ 
    protected void WriteBinary(byte[] binaryData) 
    { 
     string base64EncodedZip = Convert.ToBase64String(binaryData); 
     Write(BASE64_HEADER); 
     Write(base64EncodedZip); 
    } 
    public const string BASE64_HEADER = "Content-Transfer-Encoding: base64\n"; 
} 

它調用CompiledTemplate.Process()邏輯查找所生成的字符串中的已知的報頭,並接通串回一個字節數組寫入到磁盤。

string content = myTemplate.Process(); 
if (content.Trim().StartsWith(MySpecialBaseForT4s.BASE64_HEADER)) 
{ 
    string contentWithoutBase64Hdr = content.Trim().Replace(MySpecialBaseForT4s.BASE64_HEADER, ""); 
    byte[] binaryContent = Convert.FromBase64String(contentWithoutBase64Hdr); 
    File.WriteAllBytes(filenameAndExtension, binaryContent); 
} 

這有幫助嗎?

相關問題