T4 Assembly指令找不到指定的文件

MrD*_*oom 5 .net t4 .net-assembly visual-studio

无论使用何种方法在程序集指令中指定文件,T4引擎都找不到指定的文件.

<#@ assembly name="$(SolutionDir)packages\TestPackage\lib\net45\Test.dll"#>
Run Code Online (Sandbox Code Playgroud)

或<#@ assembly name ="C:\ Test.dll"#>

或任何其他方法导致相同的未找到问题.模板引擎似乎能够读取文件并显示其版本信息,即使它找不到它.

Errors were generated when initializing the transformation object. The transformation will not be run. The following Exception was thrown:
System.IO.FileNotFoundException: Could not load file or assembly ‘Test, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)

表明缺少依赖性.程序集没有依赖关系.

为什么T4引擎找不到我的组件?

MrD*_*oom 7

当程序集打包时,有外部引用EnvDTE或其他COM互操作类型.当在T4模板中访问EnvDTE(或其他COM)互操作时,它会尝试解析EnvDTE的引用,它将解析为试图加载的程序集.这是未找到文件异常的地方,循环引用.它是由在程序集中嵌入interop类型引用引起的(出于性能原因,默认情况下为on).

Dave Sexton 5年前发现了这个问题:

更具体地说,它的typeof(DTE)导致Visual Studio尝试加载我的程序集.我的程序集是一个.NET 4.0程序集,默认情况下,自动程序集envdte的引用是在启用NoPIA功能的情况下添加的.这会导致编译器将envdte的互操作类型嵌入到我的程序集中.因此,typeof(DTE)正在解决我的程序集中的DTE类型,这会导致Visual Studio需要加载我的程序集来解析DTE类型!

要解决此问题,必须禁用为引用的COM程序集嵌入互操作类型.

  1. 打开我的项目的References文件夹(Visual Studio 2010,.NET 4.0).
  2. 对于自动化装配的每个参考; 例如,envdte,envdte80,vslangproj,vslangproj2,vslangproj80等...
  3. 选择引用并打开"属性"窗口.
  4. 将Embed Interop Types值更改为False.

重建原始程序集并尝试加载它.