T4模板汇编指令

时间:2011-05-27 11:03:00

标签: c# .net visual-studio-2010 t4

我有一个自定义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());
#>

我收到了以下错误:

  

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

即使MyClass.Run()只是return "//hello";

3 个答案:

答案 0 :(得分:8)

好像你的问题:

  

错误编译转换:无法找到元数据文件'dotless.Core'

这是由于此处描述的兼容性中断:

http://weblogs.asp.net/lhunt/archive/2010/05/04/t4-template-error-assembly-directive-cannot-locate-referenced-assembly-in-visual-studio-2010-project.aspx

答案 1 :(得分:8)

我昨天才遇到同样的问题,我们有一个解决方案级别的Binaries文件夹,所以以下内容对我有用$(SolutionDir)Binaries\Assembly.dll

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

答案 2 :(得分:0)

(注意:所有这些都适用于VS2013。可能与其他版本不同。)

首先,使用$(TargetDir)在输出路径中查找文件。

例如:<#@ assembly name="$(TargetDir)MyDLL.dll" #>

其次,似乎模板生成器在将引用复制到输出文件夹之前运行。因此,如果您还没有成功构建,或者在项目添加新引用时至少没有构建一次,那么.dll就不会存在。

事实上,在你成功构建之前,永远不会存在,如果你从模板生成器那里得到一个错误,那么找不到引用,你将永远不会成功建立,你被困住了。

摆脱这种情况的方法是暂时排除模板,构建项目(将复制引用),然后将其添加回来;或者手动将.dll手动复制到它抱怨的目录中。一旦建成,他们应该继续建设。

(由于模板生成器在引用被复制之前运行,我怀疑会有类似的问题涉及新代码。如果你向库中添加新代码,并在构建之前在模板中使用它,你就会陷入困境模板不知道新代码,这会导致错误,这会使您的构建失败,因此它不会获得新版本,并且您再次陷入困境。)

(每当你清理或重建你的项目时,你也应该在这种情况下结束,但我似乎没有经常发生这种情况,因此可能会有更多的事情比我意识到的那样。)