繁体   English   中英

无法在T4模板中引用装配

[英]Can't reference an assembly in a T4 template

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

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");

但我真的不喜欢这个,因为我想在各种项目中使用这个模板,而我只是简单地讨厌重复,尤其是魔术字符串。

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

快乐的编码!

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

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

我建议你在公共程序集文件夹中放置一个引用的程序集,另一个,甚至更好的解决方案是硬编码引用程序集的路径。

关于此主题的非常好的帖子: T4模板错误 - Assembly Directive无法在Visual Studio 2010项目中找到引用的程序集。

基本上MS决定制动改变,项目参考组件也不被T4引擎参考。

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

更多内容: Visual Studio 2010中T4的新功能

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

我最终将程序集复制到项目的根文件夹中,并将其作为项目本身的参考。 然后,我在.tt文件中添加了以下行:

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

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

我确信类似的东西也适用于你的装配......

我发现在创建和使用gax工具包和包中存在许多情况,其中构建对引用结构的方式非常满意,但运行时因为无法找到它所寻找的内容而烦恼 - 通常当主程序集引用使用gax元素的程序集然后该程序集依次引用主程序集不引用的另一个程序集时发生。

尝试直接在主程序集中包含有问题的程序集 - 并考虑您可能需要编写后期构建指令以将其移动到“预期”位置 - 而在某种情况下,它应该胜过必须硬连接路径。

因人而异

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM