【问题标题】:System.BadImageFormatException when target framework is 4.0目标框架为 4.0 时的 System.BadImageFormatException
【发布时间】:2020-09-12 13:14:33
【问题描述】:

将 Target Framework 更改为 .net framework 4 后出现运行时异常: 'System.BadImageFormatException' 类型的第一次机会异常发生在

使用目标框架 3.5 构建时,一切正常。

我正在构建的平台是 x86(我发现构建到 x64 晚上会导致问题)。

可能是什么问题?

【问题讨论】:

标签: c# .net-4.0


【解决方案1】:

MSDN 列出了可能的原因,因此我建议将其作为检查表运行:

  • 尝试加载非托管动态链接库或可执行文件(例如 Windows 系统 DLL),就好像它是 .NET Framework 程序集一样。

  • DLL 或可执行文件作为 64 位程序集加载,但它包含 32 位功能或资源。例如,它依赖于 COM 互操作或调用 32 位动态链接库中的方法。

  • 已使用不同版本的 .NET Framework 创建了组件。通常,当使用 .NET Framework 1.0 或 .NET Framework 1.1 开发的应用程序或组件尝试加载使用 .NET Framework 2.0 SP1 或更高版本开发的程序集时,或者当开发的应用程序时,会发生此异常使用 .NET Framework 2.0 SP1 或 .NET Framework 3.5 尝试加载使用 .NET Framework 4 开发的程序集。BadImageFormatException 可能会报告为编译时错误,或者可能会在运行时引发异常。

我们的想法是确保您的所有项目和依赖项都编译为针对相同的框架版本或以前的版本;并且您的每个项目在比特性方面都是兼容的;如果您要动态加载库,请确保加载它们的属性(即不要尝试将本机库作为托管程序集加载。)

也许添加更多关于您项目的配置/依赖项的信息会让我们更加果断。

【讨论】:

    【解决方案2】:

    确保所有您的解决方案中的项目正在构建到 x86x64Any Cpu - 任何不匹配都可能导致此问题。

    同样,如果您使用任何第三方库 - 也请查看他们的目标平台。

    要考虑的另一件事是这是否托管在 IIS 中 - 在这种情况下,您必须确保程序集的位数与 IIS 托管进程的位数相匹配。如果您使用的是 x64 机器,那么很可能是 x64(除非已启用 32 位托管)。

    我不得不说我通常不会偏离Any CPU,除非我对仅x86x64 的COM 组件有外部依赖。它几乎总是让人头疼。

    【讨论】:

    • AFAIK AnyCPU 可用于类库。架构重要的是入口程序集(如 Windows 服务或控制台应用程序)。除非外部依赖项(例如 dbdriver)需要一定的位数,否则我会使用 AnyCPU。
    【解决方案3】:

    最有可能的是,当您为 x86 构建时,您的一个程序集引用了 x64 程序集,或者当您为 x64 构建时,您的程序集引用了 x86。

    【讨论】:

    • 您可以在 4.0 中运行 3.5 程序集。
    • @Daniel:是的。另一个问题是问题。修正了答案。请删除反对票。
    【解决方案4】:

    我今天遇到了这个确切的问题,BadImageFormatException 仅在我将目标框架更改为 > 3.5 时才发生。关于此异常的所有其他关于 SO 的答案都在谈论我们程序集的位数(32 对 64)(这是一个常见问题,但不适用于这种情况)。

    如果项目在针对 .NET 3.5 构建时运行良好,并且在 .NET 4.0 或更高版本上引发 BadImageFormatException,那么请务必检查您的 App.config 文件中的 supportedRuntime 元素。我的是这样说的:

    <supportedRuntime version="v2.0.50727" sku="Client" />
    

    这将强制您的程序在 .NET 2.0 运行时上运行,该运行时无法加载 .NET 4.0 图像(但它可以加载 .NET 3.5 图像)。切换到 3.5 以上的框架版本时,应删除任何说明这一点的行。

    【讨论】:

      【解决方案5】:

      如果您的项目是第一次运行,并且在更改目标框架后开始出现此错误,这也可能意味着 Visual Studio 在构建中进行了一些更改,并且您的某些库不再兼容。

      所以,请尝试检查构建配置。

      这通常会有所帮助: 转到应用程序属性 > 构建 > 勾选“首选 32 位”

      【讨论】:

        【解决方案6】:

        如果您正在使用 4.5 框架,请尝试从项目属性的“调试”选项卡中取消选中“首选 32 位复选框”选项。

        我们在 4.5 框架中遇到了同样的问题。尝试了很多选择。最后,我们从项目属性的“调试”选项卡中取消选中“首选 32 位复选框”选项并开始工作。

        【讨论】:

          【解决方案7】:

          如果您在从 dll 项目开始调试时遇到此错误,请确保将可执行文件和工作目录指向预期的可执行文件和工作目录。

          【讨论】:

            【解决方案8】:

            您必须在解决方案配置中选择调试模式而不是发布模式。

            【讨论】:

              【解决方案9】:

              就我而言,这是因为 AppDynamics 中的一个已知问题。升级版本解决了这个问题。

              已知问题:4.5.x Resolved Issues by Month

              来源:BadImageFormatException: Bad method token

              【讨论】:

                【解决方案10】:

                我最近因为不同的原因遇到了这个错误。我的问题与 自动生成的绑定重定向有关,该重定向在 .net 4.5.1 及更高版本中自动启用。

                微软文档:https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection

                "...您可以在项目的属性页中轻松禁用自动生成的绑定重定向。

                1. 在解决方案资源管理器中右键单击项目并选择属性。
                2. 在应用程序页面上,取消选中自动生成绑定重定向选项。
                3. 按 Ctrl+S 保存更改。"

                【讨论】:

                  猜你喜欢
                  • 2016-12-12
                  • 2020-01-02
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-10-09
                  • 1970-01-01
                  • 2011-08-23
                  • 2019-03-02
                  相关资源
                  最近更新 更多