在T4模板中使用类

10

我需要能够在T4模板中使用一个与其在同一解决方案中的类,这个类名为Container,定义在Container.cs文件中。在文本模板中,我想要访问Container类。有没有什么想法可以实现这个需求?基本上就像这样:

<#@ template language="C#" #>

<# var container = new Container() #>

1个回答

16

通常情况下,如果你需要在模板中使用Container类的功能,你需要加载你的项目正在构建的程序集。这会引入一个循环依赖,因为你需要已经构建好的程序集来重新生成将包含在该程序集中的代码,所以请注意此点。

如果你正在使用VS2010或以上版本,则可以使用如下方法:

<#@ assembly name="$(TargetPath)" #>
<#@ import namespace="Your.Namespace" #>

然后使用您的 Container 类。

如果您使用的是 VS2010SP1 及以上版本,则不会有锁定该程序集在内存中的问题,但是如果您使用的是更早的版本,则必须在每次生成后重新启动 Visual Studio 才能重新构建项目。


2
T4模板中的另一个选项是使用File.ReadAllBytes()读取字节数组,然后将其通过Assembly.Load()加载到内存中。这需要完全限定的类new namespaces.class(),但意味着您不必每次都重新启动Visual Studio。 - Erik Philips
答案适用于VS2017,4.8框架。太好了! - petrosmm

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