我在主程序集PocoGenerator
中的测试器类中有以下代码。该程序集应该使用T4模板基于引用程序集(项目引用)中的L2S实体生成POCO,DataObjects
。
var assemblyName = "DataObjects";
var dataObjects = AppDomain.CurrentDomain.Load(new AssemblyName(assemblyName));
尽我所能,我无法让T4找到DataObjects程序集。我尝试了各种形式的assembly
指令,例如:
<#@ assembly name="DataObjects" #>
<#@ assembly name="DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" #>
无济于事。上面的代码在测试器类中工作,但不在模板中。我做错了什么?
增加: 我已经解决了这个问题,通过在我引用它的机器人位置使用程序集的绝对路径,指令以及类功能块,即
<#@ assembly name="C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll" #>
和
var sourceAssembly = Assembly.LoadFile(@"C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll");
但我真的不喜欢这个,因为我想在各种项目中使用这个模板,而我只是简单地讨厌重复,尤其是魔术字符串。
答案 0 :(得分:54)
<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #>
快乐的编码!
答案 1 :(得分:14)
要在VS2010的T4模板中引用装配,您有一些选择:
- GAC您的程序集并使用命名空间参考或完全限定类型名称
- 使用硬编码的完全合格的UNC路径
- 将程序集复制到Visual Studio“Public Assemblies Folder”并使用命名空间参考或完全限定类型名称。
- 使用或定义Windows环境变量以构建完全合格的UNC路径。
- 使用Visual Studio宏构建完全合格的UNC路径。
醇>
我建议您在公共程序集文件夹中放置一个引用的程序集,另一个可能更好的解决方案是硬编码引用程序集的路径。
关于此主题的非常好的帖子:T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project.
MS基本上决定制动更改,T4引擎也没有引用项目参考组件。
T4的装配集与包含项目的装配集完全分离,以避免在项目以前面的框架版本为目标时拾取错误的装配。项目程序集不再用于解析模板程序集指令。
答案 2 :(得分:1)
当我尝试在我的Web项目中包含Less Css for .NET时,我遇到了类似的问题。
我最终将程序集复制到项目的根文件夹中,并将其作为项目本身的参考。然后,我在.tt文件中添加了以下行:
<#@ assembly name="dotless.Core.dll" #>
<#@ import namespace="dotless.Core" #>
<#@ import namespace="dotless.Core.configuration" #>
我确信类似的东西也适用于你的装配......
答案 3 :(得分:0)
我发现在创建和使用gax工具包和软件包时有很多案例,其中构建对引用结构的方式非常满意,但是运行时会因为无法找到它所寻找的内容而烦恼 - 这通常发生在主程序集引用使用gax元素的程序集时,然后该程序集依次引用另一个程序集而不是主程序集。
尝试直接在主程序集中包含有问题的程序集 - 并考虑您可能需要编写后期构建指令以将其移动到“预期”位置 - 虽然是一种选择,它应该胜过必须硬连接路径。 / p>
YMMV