如何找到导致的dll:"针对版本构建的混合模式程序集...无法在4.0运行时加载"?

时间:2017-10-04 02:28:42

标签: .net dll mixed-mode

有很多关于&#34的问题;混合模式汇编是针对运行时的版本而构建的,无法在4.0运行时中加载",

E.g。 Mixed mode assembly is built against version 'v1.1.4322'

但是我没有看到任何讨论如何找出引用问题的WHICH引用的dll是混合模式程序集。

这是在旧的.NET 3.5 WinForms + XNA桌面应用程序的升级中发生的,该应用程序包含许多源文件,这些文件引用了各种第三方dll。我不能一次删除一个,因为那时应用程序根本不会构建。

注意:提供"混合模式的项目。"构建期间的错误是一个用VB编写的类库。

(升级到.NET 4.5.2,作为从32位转移到64位的一步。)

即使在添加useLegacyV2RuntimeActivationPolicy="true"之后,我还没有成功摆脱错误消息,而是花费更多时间来弄清楚为什么不起作用,我想要知道它是哪个dll - 我怀疑我会想用一些更新的解决方案替换有问题的库。

2 个答案:

答案 0 :(得分:1)

我解决了这个问题。

  1. Visual Studio 2015 - 工具/选项/项目和解决方案/ 构建并运行
    MSBuild项目构建输出详细程度:
    详细

  2. 从输出(Build)中,将所有文本复制粘贴到Notepad ++中。使用" sgen.exe" 查找非常长的行。这本身是值得的,因为显示所有引用的dll及其完整路径

  3. 运行命令提示符,尝试使用" sgen.exe"的变体。 ,省略各种/reference ...参数。

  4. 结果:
    可以包括大多数参考,而不会导致"混合模式"错误。
    我怀疑的所有第三方dll都不会导致此错误 发现问题是 Microsoft.DirectX。* dll

    FIX:
    切换到SharpDX
    将引用从Microsoft.DirectX.Direct3D更改为SharpDX.Direct3D11(或SharpDX.DirectX9等) (我稍后会这样做,转到64位;没有意识到我需要这样做只是为了达到.NET 4.5 +)

答案 1 :(得分:0)

我希望有更直接的方法可以从抱怨的消息中找到更多细节;但如果那是不可能的,那么一个答案是对所有dll运行某些东西(例如Peverify.exe),并检查结果:

How do I find out if a .NET assembly contains unmanaged code?

<强>结果:
没有帮助。
大多数dll似乎是托管和非托管的混合,因此这不会缩小问题范围。具体来说,这种方法并没有告诉我所有这些混合dll是否有问题,或者只是其中的一个或几个。