2011-05-27 146 views
9

我有一个自定义的dll,里面有一个类,并且(为了简单起见)有一个方法,它会返回一个字符串。T4模板组装指令

我有一个项目,它引用了所说的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";

+0

T4以及它如何查找程序集引用取决于什么版本以及如何运行它们。您是使用Visual Studio 2008还是2010?你是从Visual Studio中还是从TextTransform.exe运行它们? – CodingWithSpike 2011-05-27 15:09:47

回答

8

我昨天只有同样的问题,我们有一个解决方案级别Binaries f年纪大了,所以下面的工作对我来说是$(SolutionDir)Binaries\Assembly.dll

但是,具体情况取决于组件设置,您可以通过使用$(ProjectDir)指令使用项目相对路径...

0

(注:这一切适用于VS2013可能是不同的其他版本。)

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

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

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

而事实上它会永远不会直到你成功构建,如果你从模板生成器得到一个错误,说明找不到引用,你永远不会成功构建,而你'卡住了。

摆脱这种情况的方法是暂时排除模板,让您的项目生成(将复制引用),然后将其添加回来;或者手动将.dll手动复制到它所抱怨的目录中。一旦事情正在建设,他们应该保持建设。 (由于模板生成器在引用被复制之前运行,我怀疑会有类似的问题涉及新代码。如果您将新代码添加到库中,并在构建之前在模板中使用它,那么您将会遇到模板不知道新代码的情况,从而导致错误,从而导致构建失败,因此它没有得到新的版本,你又被卡住了。)

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