506

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

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

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

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

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

4

24 回答 24

572

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

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

在此处输入图像描述

于 2011-01-06T20:08:11.540 回答
143

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

于 2010-01-08T01:59:53.327 回答
96

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

项目属性,构建选项卡

Platform Target下选择 x86 (或更一般地,与您链接到的库匹配的体系结构)

项目属性,平台目标

我希望这可以帮助别人!:)

于 2013-10-21T07:35:49.817 回答
79

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

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

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

于 2016-07-05T13:46:57.163 回答
56

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

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

检查下拉菜单“目标 CPU”。它应该与您正在构建的“平台”相匹配。也就是说,如果您正在构建“Any CPU”,那么“Target CPU”应该是“Any CPU”。通过使它们处于活动状态并检查此设置来浏览所有平台。

于 2011-12-12T19:13:01.113 回答
40

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

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

在此处输入图像描述

于 2013-09-24T13:55:06.417 回答
12

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

于 2012-12-11T20:30:25.417 回答
8

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

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

于 2012-10-05T13:55:56.223 回答
7

1:转到:工具 > 选项 > 项目和解决方案 > Web 项目 > 使用 64 位版本的 IIS Express 2:更改以下 Web 服务项目的设置。 在此处输入图像描述

于 2020-04-30T06:33:25.747 回答
7

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

作为 64 位进程运行单元测试

它说

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

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

将处理器架构显式设置为 x64

于 2020-08-29T09:04:52.877 回答
6

我们有一个类似的问题,我们设法通过将平台目标设置为 x86 来解决它。项目属性-> 构建

于 2019-08-19T02:34:17.093 回答
4

基于@paibamboo 的答案

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

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

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

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

于 2017-10-16T14:42:53.583 回答
3

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

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

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

改成

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

即行尾00LjAuMC4w0yLjAuMC4w(00回0y)

于 2012-03-21T13:45:20.857 回答
3

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

于 2016-06-22T07:42:11.620 回答
2

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

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

于 2012-02-15T09:21:50.940 回答
2

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

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

于 2015-05-07T19:30:07.037 回答
1

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

于 2013-04-30T09:38:40.720 回答
1

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

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

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

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

于 2015-12-16T21:58:48.597 回答
1

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

在你的csproj文件中添加

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

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

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

于 2019-06-27T20:28:13.603 回答
1

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

CallingConvention = CallingConvention.Cdecl 

在您的 DLL 导入方法中。

于 2019-10-10T10:31:30.550 回答
0

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

于 2021-03-31T23:48:03.300 回答
0

就我而言,发布后发生了同样的错误。我之前发布过另一个平台配置。

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

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

于 2021-06-29T08:17:17.843 回答
0

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

于 2021-12-01T13:24:16.410 回答
0

对于 .net core,确保 Ijwhost.dll 在输出目录中,有时它没有被复制,这会导致错误。请参阅https://github.com/dotnet/runtime/issues/38231https://stackoverflow.com/a/58773266/9665729

于 2022-02-07T11:33:35.753 回答