2011-06-22 7 views
2

私はT4テンプレートをたくさん使っていますが、テキストベースのファイル(Tのすべてがテキストを意味する)のためにのみ使用しています。T4を使用して生のバイトを出力に書き込むことはできますか?

しかし、私は今、イメージ上でそれを使うと有益なシナリオを持っています - イメージを読んで、何かをして、それを書き戻します。 (T4はVisual Studioとソースコントロールにうまく統合されているので、できるだけmsbuild-tasksやpostbuildアプリケーションを避けたい)。

<#@ output extension=".png" encoding="ASCII" #>を設定しても、生成されたファイルには正確なバイトが含まれていない可能性があります。おそらく、バイトをcharまたは文字列に変換すると変換されるためです。

これを行う方法はありますか?私は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); 
} 

これは役に立ちますか?

関連する問題