首页 文章

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

提问于
浏览
429

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

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

起初,我将我的项目设置为Any CPU平台,因此我将它们都更改为x86,但此错误仍在发生 . 这真的是我所知道的唯一解决方案 .

这些DLL不具备源代码 . 我想也许那不是全部 . 另外,在这种情况下不会抛出 DllNotFoundException 吗?

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

15 回答

  • 1

    Build 在@paibamboo的答案之上

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

    我的同事检查了这个盒子(他明确地查找了它),但是有错误信息 . 几个小时后,他取消选中此框并再次检查 . 瞧,现在代码成功了 .

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

    对更多知识渊博的用户提出的问题:上周(对于VS 2015)是否有更新或某些事情与各州同步?

  • 3

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

    重新启动您的网站,它应该工作 .

    enter image description here

  • 64

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

  • 8

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

    Project properties, build tab

    Platform Target 下选择x86(或更常见的是 architecture 以匹配您链接到的库)

    Project properties, platform target

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

  • 1

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

    我找到了另一件要检查的东西,为我修好了 . 在Visual Studio中,右键单击项目并打开“属性” . 单击“编译”(或“构建”)选项卡,然后单击底部的“高级编译选项” .

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

  • 7

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

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

  • 46

    如果您使用的是任何CPU,则在选中“首选32位”选项时可能会遇到此问题:

    确保项目's property'的Build选项卡中的此选项为 uncheck

    enter image description here

  • 1

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

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

  • 123

    在我的情况下,我在C#中使用本机DLL . 此DLL依赖于其他几个缺失的DLL . 一旦添加了其他DLL,一切正常 .

  • 2

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

    发布者Luis Mack于2010年5月12日上午8:50我发现了同样的问题,仅针对在64位计算机上进行编译时的特定项目 . SEEMS工作的一个修复是手动更改图像流中的一个字符每次在设计器中编辑用户控件或表单AAEAAAD ///// AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
    改为AAEAAAD ///// AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
    那就是00LjAuMC4w在行尾(0回到0y)回到0yLjAuMC4w

  • 32

    在我的情况下,我使用一个小的.exe,通过反射重新加载引用的DLL . 所以我只是做了这些步骤,节省了我的一天:

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

  • 1

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

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

  • 501

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

  • 2

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

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

    所以我降级到4.0并且它有效!

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

  • 34

    在我的情况下,文件的内容是错误的 . DLL是从网上下载的,但DLL的内容是HTML页面:D尝试检查它是否是二进制文件,如果它看起来像正确的DLL :)

相关问题