在T4模板中使用.NET Core程序集

3
我们目前正在将一个项目从.NET Framework迁移到.NET Core 3.1,并且我们在使一些T4模板工作时遇到了问题。这些模板从我们的解决方案中导入一个或多个程序集,以使用反射生成代码。这些程序集是.NET Core 3.1库。问题似乎在于Visual Studio 2019中的T4引擎运行在Framework上,无法正确加载Core程序集。
运行模板时,我收到了ReflectionTypeLoadException。检查异常后,可以清楚地看到T4引擎找不到System.Runtime。有一些解决方法(here),但当我应用它时,只会将问题移动到下一个依赖项,即NuGet包。因此,这个解决方法不起作用。
是否有任何方法可以让T4模板与.NET Core 3.1程序集一起工作?或者是否有任何类似的替代方案可以与.NET Core 3.1一起工作?

有一个开源的T4(重新实现)可以在.NET Core上运行。不过,它的活跃度不是很高,而且对于Core 3的支持显然需要一些调整,也就是说,需要直接从源头获取预览包。 - undefined
@JeroenMostert 我看过那个项目,但是我无法让预览工作,也无法让环境变量起作用。而且,我使用的是.NET Core 3.1而不是3.0。 - undefined
@RezaAghaei 这是一个有趣的建议,但我认为这不会起作用。我们在模板中依赖接口/类继承。 - undefined
1
你可以尝试使用Mono.TextTemplating来生成你的模板。它更多是一个开发工具,而不是用户界面工具,但模板可以生成。 - undefined
@Thundter,Jeroen已经提过这个建议了,但不幸的是它不支持.NET Core 3.1。 - undefined
显示剩余2条评论
1个回答

7

我曾经遇到这个问题,但找不到好的解决方法。所以我开发了一种替代T4工具,它使用了Visual Studio的.NET Framework T4功能进行预处理,并使用.NET Core可执行文件来执行模板代码。你可以在GitHub上找到它。它在我的项目中运行良好,希望能够帮助其他人。


很遗憾,它不支持“include”指令,并且无法用于Linq2db。 - undefined
1
@Maxim 这两个陈述都不正确。include指令应该正常工作,对于Linq2db,您需要使用assembly指令引用正确的程序集。如果遇到问题,请在GitHub项目中创建一个问题。 - undefined
2
这是最好的Visual Studio扩展,本应不必要,但可悲的是确实需要。 - undefined
1
这个扩展在我迁移一个严重依赖于 T4 的项目到 .Net Core 6 时,拯救了我的生命。 - undefined
1
当使用此扩展时,如果您需要T4模板访问程序集的内部类型/成员,请将[assembly: InternalsVisibleTo("GeneratedTemplate.dll")]添加到包含内部类型/成员的程序集的AssemblyInfo.cs文件中。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接