C# T4在运行时在C中运行或编译tt文件#

C# T4在运行时在C中运行或编译tt文件#,c#,visual-studio,templates,t4,C#,Visual Studio,Templates,T4,我对模板引擎的最初要求之一是能够保留“原始”模板文件(在.tt文件中)库的“外部”执行/转换模板,目的是允许使用所述库的开发人员根据所需生成的模板的要求,在必要时对模板进行小的调整 该库是用C#编写的,到目前为止,我唯一能让它们工作的方法是使用Visual Studio为每个模板自动生成的默认“预编译”C#类。我已经成功地使用“textcransform.exe”应用程序将.tt文件直接转换为其预期输出,但与更原生的代码内方法相比,这似乎有些粗糙 那么,我要求做的是合理的还是我选择了错误的模板引

我对模板引擎的最初要求之一是能够保留“原始”模板文件(在.tt文件中)库的“外部”执行/转换模板,目的是允许使用所述库的开发人员根据所需生成的模板的要求,在必要时对模板进行小的调整

该库是用C#编写的,到目前为止,我唯一能让它们工作的方法是使用Visual Studio为每个模板自动生成的默认“预编译”C#类。我已经成功地使用“textcransform.exe”应用程序将.tt文件直接转换为其预期输出,但与更原生的代码内方法相比,这似乎有些粗糙


那么,我要求做的是合理的还是我选择了错误的模板引擎来满足我的需求?非常感谢您的帮助。

情况完全相同-T4模板集位于主项目之外。 但它有点复杂-我有一些T4模板生成的飞行

我会尝试以下选项:

  • 批量(半手动脚本)编译T4到CS和CS到DLL
  • 侧例程,扫描给定目录中的T4模板,并为目录构建*.csproj&*.sln
  • 使用Visual Studio管理和构建带有T4模板的DLL
所有这些都很好,但目前我切换到最后一个

有一个原因:

  • 我在VisualStudio中以通常的方式调试T4模板
  • 我(使用T4Toolbox)突出显示了T4语法
  • 我可以轻松地管理编译时间
要在主生成之前重新编译项目中的所有模板,只需在*.csproj文件末尾添加5行代码:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets" />

<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
<TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

真的
假的
就这些

在此之后,您可以将“原始”模板保留在任何需要它们的地方,将它们作为DLL类型项目中的常规项进行组织,并在每个生成上拥有一个实际副本

p.S.实际的意思是,如果有人在VisualStudio之外更改它们(例如在记事本中),您将重新编译它们。仅通过TransformOutofDate即可管理此功能


p.p.S.对此有一个问题-无法正确替换CustomToolNamespace。

感谢您的回复。我将您的答案解释为(如果我错了,请纠正我),这意味着需要重新编译整个DLL以考虑“tt”文件中的任何更改。我希望我可以创建一个类似Nuget包的东西,在这个包中,您可以得到一个DLL,其中包含一些类,包括一个“模板转换器”类,该类将被调用以生成输出文件,并包含用于转换基础的tt文件。然后,当运行DLL时,它将处理使用T4文件执行文本转换所需的任何操作。您觉得这可能吗?在提供的解决方案中,每个tt文件都将从tt转换为cs/vb,并且此文件和任何附加文件(*.cs/*vb、*.resx等)的结果将编译为单个DLL。在提供的解决方案中,每个tt文件都将从tt转换为cs/vb,以及此文件和任何附加文件的结果(*.cs/*vb、*.resx等)将编译为单个DLL。如果您只想重新编译模板,可以将项目分为两个模板和其他模板。通过这种方式,您将能够更新任何模板,并使用MsBuild在simple*.bat中重新编译它们。但这需要系统上几乎完整的Visual Studio。如果您愿意在目标系统可以查看TextTransfor.exe(这是TT编译器),然后查看csc.exe(这是CS编译器),并执行两个编译阶段。但我不建议采用这种方式-项目文件中发生更改的MsBuild执行的操作完全相同,而且更多。