Могу ли я использовать T4 для записи сырых байтов в вывод? - PullRequest
2 голосов
/ 23 июня 2011

Я часто использую шаблоны T4, но только для текстовых файлов (в конце концов один из символов T обозначает Text).

Однако у меня теперь есть сценарий, в котором это было бы полезноэто на изображении - прочитайте изображение, сделайте что-нибудь с ним, напишите это назад.(Я хочу, по возможности, избегать задач msbuild-задач или приложений пост-сборки, поскольку T4 хорошо интегрируется в Visual Studio и систему контроля версий).

Однако даже при установке <#@ output extension=".png" encoding="ASCII" #> в сгенерированном файле нет точных байтов., предположительно потому, что преобразование байта в символ или строку вызывает преобразование, которое его меняет.

Есть ли способ сделать это?Я не хочу делать File.WriteAllBytes, потому что тогда это плохо работает с контролем версий.

Ответы [ 3 ]

3 голосов
/ 30 августа 2012

Наши шаблоны 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 голос
/ 23 июня 2011

Я не думаю, что это возможно с T4, но вы можете написать свой собственный генератор файлов VS без особых усилий, см. Здесь: Написание специального инструмента для генерации кода для Visual Studio .NET

1 голос
/ 23 июня 2011

Текстовые шаблоны всегда генерируют строку (вы можете увидеть это при создании предварительно обработанного текстового шаблона в коде за файлом). Он генерирует некоторый код, который объединит строку. Если вы не создадите свой собственный метод их анализа, невозможно использовать текстовые шаблоны для других целей, кроме генерации текстовых файлов.

...