0

T4 テンプレートのファイル名をパラメーターとして受け取り、テンプレートを処理するコンソール プログラムを作成しようとしています。これは、ユーザーがプログラムを再コンパイルせずにテンプレートを更新できるようにするためです。

私が見つけた最も簡単な解決策は、Visual Studio 内で C# クラスにプリコンパイルする 2 つ目のテンプレートを作成することでした。これにより、外部テンプレート「Template.tt」が実行されます。

<#@ template language="C#" hostspecific="True" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#
    string template = File.ReadAllText(Host.ResolvePath("Template.tt"));
    Engine engine = new Engine();
    string output = engine.ProcessTemplate(template, Host);
    Write(output);
#>

次に、コンソール プログラムの Program.cs 内で、次の "呼び出し" テンプレートを実行します。

string templateText = new Caller().TransformText();

問題は、これを実行すると (F5)、ホストが null であるため、呼び出し元テンプレートの最初の行で NullReferenceException がスローされることです。

ただし、ホスト固有を True に設定すると、ホストが得られると思いました。

ホストを取得するにはどうすればよいですか? 本当に自分で転がしたくありません。または、外部 T4 テンプレートを実行するより良い方法はありますか?

4

2 に答える 2

0

実際のカスタム (コマンド ライン アプリ ベース) T4 ホストの実装はそれほど難しくありません。コードを入手した場所を思い出せませんが、T4 モジュラー コンソール アプリ ランナーのリンクは次のとおりです: https://github .com/abstractiondev/absbuilder

実際のコマンド ライン ホストは次のとおりです: https://github.com/abstractiondev/absbuilder/blob/master/AbstractionBuilder/CustomCmdLineHost.cs

T4 の部分を参照するために、Linux の Mono ランタイム / MonoDevelop 環境でツールを実行しました。現在はテストに基づいています (1 ~ 2 年前のことです)。非常に賢明なライセンス (私の記憶が正しければ MIT または Apache 2.0)。

于 2013-05-22T16:05:57.317 に答える