我可以使用T4将原始字节写入输出吗?

时间:2011-06-22 20:55:38

标签: .net visual-studio-2010 t4

我经常使用T4模板,但仅适用于基于文本的文件(在所有T代表Text之后)。

然而,我现在有一个场景,在图像上使用它会很有用 - 读取图像,用它做一些事情,然后再写回来。 (如果可能的话,我想避免使用msbuild-tasks或postbuild应用程序,因为T4很好地集成到Visual Studio和源代码控制中。)

但是,即使设置<#@ output extension=".png" encoding="ASCII" #>,生成的文件也没有确切的字节,大概是因为将一个字节转换为字符或字符串会导致转换更改它。

有没有办法做到这一点?我不想做File.WriteAllBytes,因为这样就不能很好地处理源代码控制。

3 个答案:

答案 0 :(得分: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);
}

这有帮助吗?

答案 1 :(得分:1)

文本模板始终生成一个字符串(您可以在代码隐藏文件中创建预处理文本模板时看到此字符串)。它生成一些将连接字符串的代码。除非您创建自己的解析方法,否则无法将文本模板用于生成文本文件以外的其他目的。

答案 2 :(得分:1)

我认为T4不可能,但你可以不费吹灰之力编写自己的自定义VS文件生成器,请看这里:Writing a custom tool to generate code for Visual Studio .NET