【问题标题】:T4 Assembly directive cannot find the file specifiedT4 汇编指令找不到指定的文件
【发布时间】:2015-01-22 04:00:42
【问题描述】:

无论使用什么方法在汇编指令中指定文件,T4 引擎都找不到指定的文件。

<#@ assembly name="$(SolutionDir)packages\TestPackage\lib\net45\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.

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

为什么 T4 引擎找不到我的程序集?

【问题讨论】:

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


    【解决方案1】:

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

    Dave Sexton found this issue 5 years ago:

    更具体地说,是 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. 将嵌入互操作类型值更改为 False。

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

    【讨论】:

    • 太棒了,我从来没有想到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2011-11-22
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多