2

最近、Visual StudioでT4テンプレートを作成しましたが、理由がわからない問題が発生し始めました。テンプレートを編集して実行すると、期待どおりに実行されます。テンプレートを編集せずに再度実行すると、コンテンツが重複して出力されます。編集せずに再度実行すると、別の重複が追加され、出力が3回表示されます。等々。

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".txt" #>
<#@ Assembly Name="System.Core" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #> 
<#
    input.Add("data1");
    input.Add("data2");
    foreach(var data in input)
    {
#>
<#=data#>
<#
    }
#>
<#+
    static List<string> input = new List<string>();
#>
4

1 に答える 1

1

いくつかの論理的な思考の後、私はテンプレートがどういうわけか私の入力を「覚えている」と結論付けました。それから、入力を収集するために組み込んだ静的クラス機能かもしれないと思いました。それを削除すると問題が解決しました!そもそも静的なものがあったのは、コンソールアプリケーションで複雑な初期化ロジックのほとんどを最初にテストし、それをテンプレートにコピーしたためです。

結論:つまり、Visual Studioは、保存時にT4テンプレートからライブラリを構築し、それをappdomainにロードしてから、実行するようです。そして、あなたがあなたのテンプレートを編集するまで、それはこのロードされたライブラリを再利用します。これが、この静的変数が前回テンプレートが実行されたときの入力をどのように記憶していたか、つまりまだ生きていることです。

ちなみに、次回はstatic void main()の隣ではなく、クラスインスタンス内で初期化コードをテストします。

于 2013-02-02T09:14:30.913 に答える