如何找到哪个 dll 导致:"Mixed mode assembly built against version ... cannot be loaded in 4.0 runtime"?

How find which dll is causing: "Mixed mode assembly built against version ... cannot be loaded in 4.0 runtime"?

关于"Mixed mode assembly is built against version .. of the runtime and cannot be loaded in the 4.0 runtime",

有很多问题

例如Mixed mode assembly is built against version 'v1.1.4322'

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

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

注意:在构建过程中给出 "Mixed mode .." 错误的项目是一个 class 库,用 VB.

编写

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

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

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

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

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

我按如下方式解决了这个问题。

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

  2. 从输出(构建)中,将所有文本复制粘贴到 Notepad++ 中。查找带有 "sgen.exe" 的很长的行。这本身就很有价值,因为它 显示了所有引用的 dll 及其完整路径 .

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

结果:
大多数参考文献都可以包含在内,而不会导致 "mixed mode" 错误。
我怀疑的所有第三方 dll 都不会导致此错误。
发现问题是Microsoft.DirectX.* dlls

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