2010-08-08 70 views
30

我在我的主程序集PocoGenerator中的测试仪类中有以下代码。该程序集应该使用T4模板来生成基于引用程序集(项目参考)中的L2S实体的POCO,DataObjects无法在T4模板中引用程序集

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

你的模板项目应该有一个项目引用您的依赖关系的项目。上面的“汇编”标签看起来不错。你也应该有一个“导入”参考。你得到了什么确切的错误信息? (和AppDomain的东西是什么?你不应该这样做) – 2010-08-08 16:58:21

+0

AppDomain的东西是tp使我能够迭代当前AppDomain中加载的程序集之一中的所有类型。它与引用模板本身的程序集无关。 – ProfK 2010-08-08 17:22:32

+0

是的,我现在看到。你收到了什么确切的错误信息? – 2010-08-08 18:54:59

回答

54
<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #> 

编码快乐!

+1

尽管说明这是一个仅用于VS2010的功能 – GarethJ 2011-01-15 22:30:12

+30

或者甚至更好:'<#@ assembly name =“$(ProjectDir)$(OutDir)$(TargetFileName)”#>' – 2011-02-08 10:34:37

+13

最简单:'<#@ Assembly name =“ $(TargetPath)“#>' – pylover 2012-07-21 08:16:49

1

当我试图在我的Web项目中包含Less Css for .NET时,我遇到了类似的问题。

我已经结束了在我的项目的根文件夹中复制程序集并将其作为项目本身中的引用。然后,我已经添加在.TT文件中以下行:

<#@ assembly name="dotless.Core.dll" #> 

<#@ import namespace="dotless.Core" #> 
<#@ import namespace="dotless.Core.configuration" #> 

我敢肯定,类似的东西应该与你的装配工作,以及...

0

我发现有一个创建和使用gax工具包和程序包的情况的数量,其中构建完全满意于引用的结构方式,但运行时会受到所有困扰,因为它无法找到它寻找的内容 - 这通常发生在主要程序集引用使用gax元素的组件,然后该组件反过来引用另一个组件,主组件不包含该组件。

尝试直接在您的主要程序集中包括有问题的程序集 - 并考虑您可能需要编写后期构建指令以将其移动到“预期”位置 - 但是,它应该击败必要的路径。

因人而异

14

要引用装配在VS2010 T4模板,你有一些选择:

  1. GAC程序集,并使用命名空间参考或完全限定的类型名称
  2. 使用硬编码的完全合格的UNC路径
  3. 将程序集复制到Visual Studio“公共程序集文件夹”并使用命名空间参考或完全限定类型名称。
  4. 使用或定义Windows环境变量来构建完全限定的UNC路径。
  5. 使用Visual Studio宏来构建完全限定的UNC路径。

我建议你把引用的程序集在公众集会的文件夹,另一个,甚至更好的解决办法是硬编码的引用的程序集的路径。

非常不错的职位上这个话题:T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project.

基本上MS决定将制动变化,该项目引用的程序不被T4发动机引用了。

T4的程序集集与包含项目的程序集集完全分离,以避免在项目指向以前的框架版本时拾取错误的程序集。项目程序集不再用于解决模板程序集指令。

更多的是:What's new in T4 in Visual Studio 2010

+0

+1为项目引用不再使用,这是杀了我! – dbones 2012-10-09 18:09:58

+0

@彼得Stegnar我在这里问一个相关的问题:http://stackoverflow.com/questions/13838142/put-all-methods-in-one-tt-file-and-use-it-in-another-t4-files在代码模板,你请检查它 – Saeid 2012-12-12 11:20:20