【问题标题】:How find which dll is causing: "Mixed mode assembly built against version ... cannot be loaded in 4.0 runtime"?如何找到哪个 dll 导致:“针对版本构建的混合模式程序集......无法在 4.0 运行时加载”?
【发布时间】:2018-03-15 07:54:17
【问题描述】:

关于“混合模式程序集是针对版本..运行时构建的,无法在4.0运行时加载”的问题很多,

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

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

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

注意:在构建过程中出现“混合模式..”错误的项目是一个用 VB 编写的类库。

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

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

【问题讨论】:

    标签: .net dll mixed-mode


    【解决方案1】:

    我解决了这个问题。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-11
        • 2012-08-03
        • 2013-01-08
        • 2011-09-19
        • 2015-05-28
        • 1970-01-01
        • 2012-02-26
        • 2016-05-08
        • 2023-03-24
        相关资源
        最近更新 更多