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

经过一些逻辑思考后,我得出结论,该模板以某种方式“记住”了我的输入。然后我认为这可能是我为收集输入而包含的静态类功能。删除它解决了问题!之所以会出现静态,是因为我首先在控制台应用程序中测试了大部分复杂的初始化逻辑,然后将其复制到模板中。

结论:因此,当您保存 T4 模板并将其加载到 appdomain 中然后执行它时,似乎 Visual Studio 会从您的 T4 模板构建一个库。它会重用这个加载的库,直到你编辑你的模板。这就是这个静态变量如何记住上次运行模板时的输入 - 它仍然存在。

作为旁注,下次我将在类实例中测试我的初始化代码,而不是在静态 void main() 旁边!

于 2013-02-02T09:14:30.913 回答