2011-06-22 63 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); 
} 

这有帮助吗?

相关问题