即使平台相同,“试图加载格式不正确的程序”

Posted

技术标签:

【中文标题】即使平台相同,“试图加载格式不正确的程序”【英文标题】:"An attempt was made to load a program with an incorrect format" even when the platforms are the same 【发布时间】:2011-01-02 16:26:54 【问题描述】:

我在 64 位系统上从 32 位非托管 DLL 调用函数。我得到的是:

BadImageFormatException:试图加载格式不正确的程序。 (HRESULT 异常:0x8007000B)

起初,我将我的项目设置为 Any CPU 平台,因此我将它们都更改为 x86,但仍然出现此错误。这确实是我所知道的唯一解决方法。

这些 DLL 没有损坏或其他任何东西,因为我可以将它们与其他程序一起使用(我没有源代码)。我想也许它没有找到依赖关系,但我检查了一下,它们都在那里。另外,在这种情况下不会抛出DllNotFoundException 吗?

我还能做什么?在您说“改用 64 位非托管 DLL”之前,让我指出没有。 ;)

【问题讨论】:

您将哪些项目更改为 x86?当你得到异常时,如何通过调试器或手动执行它们?如果是后者,您是否注意到当您更改为 x86 时,您的 bin\ 目录中有一个新文件夹?现在基本上是 bin\x86\Debug 文件。 您能否验证可执行文件是否在 32 位模式下运行(*32 在进程管理器中)? @Lasse V. Karlsen:是的,当我在每个项目中更改平台时,我从输出路径中删除了 x86 位。我的第一个项目是一个将函数包装在非托管 DLL 中的 DLL。第二个项目是使用第一个 DLL 中的包装器的可执行文件。两者都设置为 x86。 @JP:实际上,进程管理器并没有显示它作为 32 位进程运行。这是为什么呢? 【参考方案1】:

如果您尝试在 IIS 7(和/或 64 位操作系统机器)上运行 32 位应用程序,您将收到相同的错误。因此,在 IIS 7 中,右键单击应用程序的应用程序池并转到“高级设置”并将“启用 32 位应用程序”更改为“TRUE”。

重新启动您的网站,它应该可以工作。

【讨论】:

哦,我的日子里,我一直在寻找安装额外的 IIS 组件,而这就是答案……有人能建议选择此选项的缺点吗? 这里有一个关于性能问题的很好的讨论:***.com/questions/507820/… 我在使用 SharpSvn 时遇到了问题,但这没有帮助。 :( 我告诉你的这个程序集非常错误...... 这个答案对我来说是一个wtf,因为这个问题根本没有提到IIS! 我认为需要注意的是,当您将其更改为“真”时,它可能会删除您必须再次添加的添加的“应用程序”。【参考方案2】:

不知何故,配置管理器中的 Build 复选框已取消选中我的可执行文件,因此它仍在使用旧的 Any CPU 构建运行。在我修复该问题后,Visual Studio 抱怨它无法调试程序集,但通过重新启动已修复。

【讨论】:

非常感谢。这也吸引了我。检查了配置管理器中的构建,现在它可以工作了(WPF 桌面应用程序)。 如果您已完成上述所有操作,并检查了您的平台设置、构建配置设置、清理了解决方案但仍然无法正常工作 - 搜索 DLL 的所有实例并将其删除。 对于 VS 2015 这仍然有效 - 尽管我不需要重新启动 :) 就是这样!重新访问您的配置管理器设置就是答案。【参考方案3】:

Visual Studio 中,右键单击您的 项目 -> 在左侧窗格中单击 Build 选项卡,

Platform Target 下选择 x86(或更一般的 architecture 以匹配您要链接到的库)

我希望这对某人有所帮助! :)

【讨论】:

这解决了我在 VS2013 中的问题,我发现另一种解决方法是将“平台目标”保留为“任何 CPU”,但选中“首选 32 位”复选框。 虽然您需要使用 .NET 4.5 或更高版本才能选中“首选 32 位”复选框 是的,但我将“任何 CPU”中的项目转换为“x64”。我的 32 位项目工作正常,但我转换为 64 位的代码相同,该项目不能像 32 位一样正常工作。你能给我正确的64位转换过程吗... @IsmayilS 确保您使用的是 64 位版本的链接库 我升级到 VS2022 并且出于某种原因 1 项目将平台目标切换到 x86。即使解决方案管理器显示 Any CPU,它仍在尝试编译到 x86。【参考方案4】:

如果您在单击绿色箭头按钮运行应用程序时遇到此错误,但仍想以 64 位运行应用程序。您可以在 VS 2013、2015、2017 和 2019 中执行此操作

转到:工具 > 选项 > 项目和解决方案 > Web 项目 > 使用 64 位版本的 IIS Express

或者您可以在 Project Properties > Web > Bitness 中为每个项目执行此操作

【讨论】:

谢谢。我尝试了很多,但没有任何帮助。你是我的救命恩人。我有 64 位操作系统,安装了 64 位 Visual Studio [由于未知原因,它仍然以 32 位运行]。当我将平台目标设置为 x64 时,它抛出错误 BadImageFormatException。通过您的修复,它起作用了。我给了你一个赞成票。你摇滚 很高兴能帮上忙 :) 这是我需要的答案。非常感谢! 非常感谢,这解决了问题。它适用于 Visual Studio 2017 32 位进程。 只有上述设置不起作用,我在项目设置中做了一次矿石更改【参考方案5】:

我也遇到了这个问题。在这里尝试了所有建议,但它们没有帮助。

我发现了另一件事来检查它是否为我修复了它。在 Visual Studio 中,右键单击项目并打开“属性”。单击“编译”(或“构建”)选项卡,然后单击底部的“高级编译选项”。

检查下拉菜单“目标 CPU”。它应该与您正在构建的“平台”相匹配。也就是说,如果您正在构建“Any CPU”,那么“Target CPU”应该是“Any CPU”。激活所有平台并检查此设置。

【讨论】:

对于我们这些只使用编译器的人,我的解决方法是在编译器标志中添加“/platform:x86”。 这也为我修复了它。我不得不调整“构建”选项卡上的“平台目标”。 如果您使用的是 64 位,还要检查“首选 32 位”标志。我不得不为我禁用它。【参考方案6】:

如果您使用的是 Any CPU,如果选中了 Prefer 32-bit 选项,您可能会遇到此问题:

确保在项目属性的构建选项卡中取消选中此选项!

【讨论】:

如果您能指出在 Visual Studio 中的哪个位置可以找到此选项,将会很有帮助。 @trysis,这个选项在项目设置面板的Build页面中。 我说把它放进去会很有帮助。就这个答案而言,没有上下文可以告诉倒霉的 *** 的新用户在哪里可以找到它。 获取此表单的路径是什么?我找不到它 在 Visual Studio 中,右键单击项目并选择“属性”。【参考方案7】:

就我而言,我在 C# 中使用了本机 DLL。此 DLL 依赖于缺少的其他几个 DLL。添加其他 DLL 后,一切正常。

【讨论】:

【参考方案8】:

这篇文章有点离题,但搜索此错误消息将我带到这里。

如果您通过团队系统构建并收到此错误,则构建定义过程选项卡具有“MSBuild 平台”设置。如果将其设置为“自动”,您可能会遇到此问题。将其更改为“X86”也可以解决该错误。

【讨论】:

这是我所经历的最接近的答案。我有一个必须是 x86 的 dll。我在另一个项目中使用它,默认是 AnyCPU。他们只需要匹配。在这种情况下,它并没有太大的区别,所以我将新项目更改为 x86。【参考方案9】:

1:转到:工具 > 选项 > 项目和解决方案 > Web 项目 > 使用 64 位版本的 IIS Express 2:更改以下 Web 服务项目的设置。

【讨论】:

是所提出问题的简单答案。为我工作。 你拯救了我的一天!谢谢【参考方案10】:

我们遇到了类似的问题,我们设法通过将平台目标设置为 x86 来解决它。

【讨论】:

所以 x86 dll 与 x64 不同?有没有办法在引用的 dll 文件上检测到这一点? @NoBugs 看起来可以。看看这个thread【参考方案11】:

使用 Visual Studio 2019 时,我想运行测试(直接来自 VS 的 MSTest)时遇到了类似的问题。就我而言,我只有一个 x64 本机 DLL,并且收到了此错误消息。首先,我认为这是因为 Visual Studio 作为 x86 运行,但这个页面帮助我解决了这个问题:

Run unit test as a 64-bit process

它说

    将您的项目设置为任何 CPU 明确定义处理器架构

我都做了(我明确设置了 x64),然后我的测试开始工作。

【讨论】:

不错的一个。这将帮助我部门的一些人。现在我们只需要对原因进行排序。【参考方案12】:

基于@paibamboo 的回答

他说:转到:工具>选项>项目和解决方案>Web项目>使用64位版本的IIS Express

我的同事选中了这个框(他明确地寻找它),但有问题的错误消息。几个小时后,他取消选中该框并再次选中它。你瞧:代码现在运行成功了。

看来,这个盒子的状态保存在两个地方变得不同步了。取消并重新检查它再次同步。

对更多知识渊博的用户的问题:上周(对于 VS 2015)是否有更新或某些东西使状态不同步?

【讨论】:

【参考方案13】:

另见this answer,它为我解决了同样的问题。

Luis Mack 于 2010 年 5 月 12 日上午 8:50 发布我发现了同样的问题,仅针对在 64 位机器上编译的特定项目。似乎可行的修复方法是每次在设计器中编辑用户控件或表单时手动更改图像流中的一个字符

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

改成

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

00LjAuMC4w回到0yLjAuMC4w行尾(00回0y)

【讨论】:

链接的简短摘要会很有帮助@Shaul :) 壮丽的。谢谢,简报会为您的评论添加内容【参考方案14】:

在我的例子中,我使用的是一个很小的 ​​.exe,它通过反射重新加载引用的 DLL。所以我只需执行以下步骤即可节省我的时间:

从解决方案资源管理器的项目属性中,在构建选项卡中,我选择来自 x86 的目标平台

【讨论】:

【参考方案15】:

在我的例子中,我通过 MSTest 运行测试,发现我正在将 32 位和 64 位 DLL 部署到测试目录。该程序偏爱 64 位 DLL 并导致它失败。

TL;DR确保您只将 32 位 DLL 部署到测试中。

【讨论】:

【参考方案16】:

就我而言,这是文件的错误内容。 DLL 是从网上下载的,但 DLL 的内容是 html 页面:D 尝试检查它是否是二进制文件,如果它看起来像正确的 DLL :)

【讨论】:

【参考方案17】:

我以“Windows”的方式解决了这个问题。在检查了我的所有设置、清理解决方案并重建它之后,我只需关闭解决方案并重新打开它。然后它起作用了,所以VS可能在清洁过程中没有摆脱一些东西。 当逻辑解决方案不起作用时,我通常会求助于不合逻辑(或看似不合逻辑)的解决方案。 Windows 没有让我失望。 :)

【讨论】:

【参考方案18】:

我能够通过将我的构建版本与服务器上的 .NET 版本匹配来解决此问题。

我双击 .exe 只是为了看看会发生什么,它告诉我安装 4.5....

所以我降级到 4.0 并且成功了!

所以请确保您的版本匹配。它在我的开发盒上运行良好,但服务器的 .NET 版本较旧。

【讨论】:

【参考方案19】:

我们在 .NET 核心中遇到了同样的问题。解决方案是下载 32 位 .netcore 运行时,并让您的项目目标为x86

在您的csproj 文件中添加

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

这用于 Windows 机器,你必须调整路径等用于 Linux/OSX

【讨论】:

【参考方案20】:

如果您要导入非托管 DLL,请使用

CallingConvention = CallingConvention.Cdecl 

在您的 DLL 导入方法中。

【讨论】:

【参考方案21】:

就我而言,我没有将正确的项目设置为启动项目。我去了解决方案设置并选择了正确的启动项目,它工作了

【讨论】:

【参考方案22】:

在我的情况下,发布后也发生了同样的错误。我之前发布过其他平台配置。

解决方案是先清理发布文件夹,然后它就起作用了。

(或者将“删除现有文件”选项设置为 true)

【讨论】:

【参考方案23】:

可能导致此异常的另一个原因是 Dll 的目标平台缺少 C++ Redistributables。在 VM 上进行测试时,我很难找到答案。

【讨论】:

以上是关于即使平台相同,“试图加载格式不正确的程序”的主要内容,如果未能解决你的问题,请参考以下文章

数据库安装操作失败并显示试图加载格式不正确的程序

试图加载格式不正确的程序

打开北京社保软件提示试图加载格式不正确的程序。异常来自HRESULT:0X8007000B

未能加载文件或程序集“XXXXXX”或它的某一个依赖项。试图加载格式不正确的程序。

cad打开出现试图加载格式不正确的程序怎么处理

sasenterpriseguide试图加载格式不正确的程序