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

时间:2015-01-22 04:00:42

标签: .net visual-studio .net-assembly t4

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

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

或     &lt;#@ assembly name =&#34; C:\ Test.dll&#34;#&gt;

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

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.

表示缺少依赖项。程序集没有依赖关系。

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

1 个答案:

答案 0 :(得分:7)

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

Dave Sexton found this issue 5 years ago

  

更具体地说,它的类型(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.   
  3. 对自动化装配的每个参考;例如,envdte,envdte80,vslangproj,vslangproj2,vslangproj80等......
  4.   
  5. 选择参考并打开“属性”窗口。
  6.   
  7. 将Embed Interop Types值更改为False。
  8.   

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