我有一个自定义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";
答案 0 :(得分:8)
好像你的问题:
错误编译转换:无法找到元数据文件'dotless.Core'
这是由于此处描述的兼容性中断:
答案 1 :(得分:8)
我昨天才遇到同样的问题,我们有一个解决方案级别的Binaries文件夹,所以以下内容对我有用$(SolutionDir)Binaries\Assembly.dll
。
但是,根据程序集的位置,您可以使用$(ProjectDir)
指令来使用项目相对路径...
答案 2 :(得分:0)
(注意:所有这些都适用于VS2013。可能与其他版本不同。)
首先,使用$(TargetDir)
在输出路径中查找文件。
例如:<#@ assembly name="$(TargetDir)MyDLL.dll" #>
其次,似乎模板生成器在将引用复制到输出文件夹之前运行。因此,如果您还没有成功构建,或者在项目添加新引用时至少没有构建一次,那么.dll就不会存在。
事实上,在你成功构建之前,永远不会存在,如果你从模板生成器那里得到一个错误,那么找不到引用,你将永远不会成功建立,你被困住了。
摆脱这种情况的方法是暂时排除模板,构建项目(将复制引用),然后将其添加回来;或者手动将.dll手动复制到它抱怨的目录中。一旦建成,他们应该继续建设。
(由于模板生成器在引用被复制之前运行,我怀疑会有类似的问题涉及新代码。如果你向库中添加新代码,并在构建之前在模板中使用它,你就会陷入困境模板不知道新代码,这会导致错误,这会使您的构建失败,因此它不会获得新版本,并且您再次陷入困境。)
(每当你清理或重建你的项目时,你也应该在这种情况下结束,但我似乎没有经常发生这种情况,因此可能会有更多的事情比我意识到的那样。)