T4模板组装指令

本文关键字:指令 T4 | 更新日期: 2023-09-27 17:57:44

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

T4模板组装指令

似乎是您的问题:

编译转换时出错:找不到元数据文件"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

就在昨天,我也遇到了同样的问题,我们有一个解决方案级别的Binaries文件夹,所以以下内容适用于我的$(SolutionDir)Binaries'Assembly.dll

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

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

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

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

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

事实上,在你成功构建之前,它永远不会出现,如果你从模板生成器中收到找不到引用的错误,你永远不会成功构建,你就会陷入困境。

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

(由于模板生成器在复制引用之前运行,我怀疑新代码也会出现类似的问题。如果你向库中添加新代码,并在构建之前在模板中使用它,你会遇到模板不知道新代码的问题,这会导致它抛出错误,使你的构建无法成功,因此它不会获得新版本又是一次。)

(每当你清理或重建你的项目时,你也应该会遇到这种情况,但我似乎不经常发生这种情况,所以这可能比我意识到的要多。)