T4模板多次处理输入

本文关键字:处理 输入 T4 | 更新日期: 2023-09-27 17:57:13

我最近在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>();
#>

T4模板多次处理输入

经过一些逻辑思考,我得出结论,模板以某种方式"补救"了我的输入。 然后我想这可能是我用来收集输入的静态类功能。 删除它解决了问题! 最初之所以存在静态,是因为我首先在控制台应用程序中测试了大多数复杂的初始化逻辑,然后将其复制到模板中。

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

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