T4模板程序集指令

10

我有一个自定义的dll,其中包含一个类,在该类中有一个方法将返回一个字符串。

我有一个引用了该dll的项目,并且我想在该项目中使用一个(未预处理的)T4模板,调用上述方法。我尝试过以下方法:

<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="MyDLL.dll" #>
<#@ output extension=".cs" #>
<#
    var template = new MyDLL.MyNamespace.MyClass();
        this.Write(template.Run());
#>

我遇到了以下错误:

Error 14编译转换时:找不到元数据文件“MyDLL.dll”
Error 13 命名空间不能直接包含字段或方法等成员

即使 MyClass.Run() 简单地返回 //hello


T4及其如何查找程序集引用取决于版本和运行方式。您是使用Visual Studio 2008还是2010?您是在Visual Studio内部运行它们,还是从TextTransform.exe运行它们? - CodingWithSpike
3个回答

8

8

我昨天也遇到了同样的问题,我们有一个特定的解决方案二进制文件夹,所以对于我来说以下内容可行:$(SolutionDir)Binaries\Assembly.dll

然而,根据程序集的位置,您可能可以使用 $(ProjectDir) 指令来使用项目相对路径...


0
(注意:以下内容适用于VS2013。在其他版本中可能存在差异。)
首先,使用 $(TargetDir) 来查找输出路径中的文件。
例如: <#@ assembly name="$(TargetDir)MyDLL.dll" #> 其次,似乎模板生成器运行在引用被复制到输出文件夹之前。因此,如果您还没有成功构建,或者还没有至少使用新引用构建一次项目,则不会有 .dll 文件存在。
实际上,直到您成功构建为止,它都不会存在;如果您从模板生成器那里收到无法找到引用的错误消息,您永远不会成功构建,而且会卡住。
摆脱这种情况的方法是暂时排除模板,使项目构建(这将复制引用),然后再添加回来;或者手动将 .dll 文件复制到出现错误的目录中。一旦能够成功构建,就应该能够一直构建下去。

由于模板生成器在复制引用之前运行,我怀疑涉及新代码的问题会类似。如果您向库中添加新代码,并在构建之前在模板中使用它,则会发现模板不知道新代码的存在,从而导致错误,使得构建失败,因此无法获取新版本,您将再次陷入困境。

每当您清理或重建项目时,您也应该遇到这种情况,但我似乎很少遇到这种情况,所以可能还有其他原因。


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