gpt4 book ai didi

c# - 将 T4 输出从导入的程序集保存到文件

转载 作者:行者123 更新时间:2023-11-30 17:25:13 24 4
gpt4 key购买 nike

我正在尝试创建一个可以导入到文本模板中的库,以使我的模板更易于使用。我的库的主要参数是模板对象。虽然这不是最佳实践,但我还没有找到可行的解决方法。一旦我引用了库中的模板对象,我就会尝试将模板的输出保存到另一个位置。这是库的代码。

namespace Templates 
{
public class Helper
{
private readonly object _thisTemplate = null;
public Helper(object input) => _thisTemplate = input;

public void SaveToFile(string path)
{
var transformTextMethod = _thisTemplate.GetType().GetMethod("TransformText");
var content = transformTextMethod.Invoke(_thisTemplate, new object[] {}).ToString();

using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
using (System.IO.StreamWriter sr = new System.IO.StreamWriter(fs))
{
sr.WriteLine(content);
sr.Flush();
}
}
}
}
}

这是我用来调用这个库的模板

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="$(ProjectDir)$(OutDir)$(TargetFileName)" #>
<#@ output extension="\\" #>
<#
var helper = new Templates.Helper(this);
var outputFile = this.Host.TemplateFile.Replace(".tt",".txt");
#>
<#= DateTime.Now.ToString() #>
<# helper.SaveToFile(outputFile); #>

模板有<#@ output extension="\\" #>这样就不会产生任何输出,而是我尝试用 SaveToFile 保存它方法。当我尝试使用 TextTemplatingFileGenerator 运行它时,它会使 Visual Studio 崩溃。为了获得更多信息,我尝试将其作为 TextTemplatingFilePreProcessor 运行,但效果很好。

谁能告诉我我做错了什么?

我也采纳了 BurnsBA 的建议并调整了模板以与 TextTransform.exe 一起使用,但是这也崩溃了

作为一种解决方法,我在我的解决方案目录的模板文件夹中有一个基本模板,并在其中添加了这样的方法......

<#+
void SaveFile(string path)
{
var content = this.GenerationEnvironment.ToString();

using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
using (System.IO.StreamWriter str = new System.IO.StreamWriter(fs))
{
str.WriteLine(content.Trim("\n\r".ToCharArray()));
str.Flush();
}
}
}
#>

...然后在我的模板顶部使用像这样的 include 指令引用这个基本模板...

<#@ include file="$(SolutionDir)Templates\BaseTemplate.ttinclude" #>

如果有人有任何想法,我仍然想找到一种可行的方法将此功能保存在一个类中?

最佳答案

你有一个无限循环...

Helper.SaveToFile 中调用 TransformText 导致模板被评估,调用 Helper.SaveToFile 再次调用 TransformText 等等等等

基类实现之所以有效,是因为您使用的是 GenerationEnvironment 属性,它不会再次计算模板。

关于c# - 将 T4 输出从导入的程序集保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59037098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com