首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用T4将原始字节写入输出?

是否可以使用T4将原始字节写入输出?
EN

Stack Overflow用户
提问于 2011-06-23 04:55:38
回答 3查看 542关注 0票数 2

我经常使用T4模板,但只用于基于文本的文件(毕竟其中一个T代表文本)。

然而,我现在有一个场景,在图像上使用它将是有益的-读取图像,对其执行某些操作,然后将其写回。(如果可能,我希望避免使用msbuild-task或后期构建应用程序,因为T4可以很好地集成到Visual Studio和源代码控制中)。

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

有没有办法做到这一点?我不想做File.WriteAllBytes,因为这不能很好地与源代码控制一起工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-23 05:26:09

我认为使用T4是不可能的,但您可以轻松地编写自己的自定义VS文件生成器,请参阅此处:Writing a custom tool to generate code for Visual Studio .NET

票数 1
EN

Stack Overflow用户

发布于 2012-08-30 20:36:34

我们的T4模板有一个公共基类(<#@ template language="C#" inherits="MySpecialBaseForT4s"...)。我们向该基类添加了一个受WriteBinary(byte[] data)保护的方法,例如,允许我们的T4模板生成一个压缩文件,并将其传递给系统中调用CompiledTemplate.Process()方法的部分。

代码语言:javascript
复制
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()的逻辑在生成的字符串中查找已知头,并将字符串转换回字节数组以写入磁盘。

代码语言:javascript
复制
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);
}

这有帮助吗?

票数 3
EN

Stack Overflow用户

发布于 2011-06-23 04:59:30

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6446458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档