65.9K
CodeProject 正在变化。 阅读更多。
Home

99个问题,但不是缺少一位

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年10月20日

CPOL

2分钟阅读

viewsIcon

7958

99个问题,但不是缺少一位

99Problems

如果你曾经在涉及32位和64位应用程序交互以及引用它们的DLL的项目中工作过,你可能已经遇到过这个问题。

BadImageFormatException: An attempt was made to load a program with an incorrect format. 
(Exception from HRESULT: 0x8007000B)

这个讨厌的 BadImageFormatException 通常源于引用了未真正设计在64位机器上运行的旧版库(*或包含非托管代码的任何库*)。如果你的32位库中的所有代码都是托管的,那么你应该一切正常,并且不太可能遇到这个问题。 这篇文章将介绍两种使用Visual Studio和IIS中提供的配置功能来解决此问题的方法。

排查此问题

遇到这个问题时,我确信你的第一反应会是在项目的/解决方案的构建目标设置中来回切换。你可能会在x86(32位)和x64(64位)之间反复切换,并尝试无数次重新构建和运行你的应用程序。

When encountering this issue, you'll undoubtedly toggle between x64, x86 and the Any CPU options. Success may vary by user.

遇到此问题时,你无疑会在x64、x86和Any CPU选项之间切换。 成功率可能因用户而异。

然后你可能会说“好吧,Any CPU设置应该有效”,然后你尝试一下,但再次遇到之前遇到的相同错误。 这并非总是如此,因为我发现这些设置中的一个偶尔可能会起作用,但成功率可能因用户和应用程序而异。

求助于IIS

如果你尝试了解决方案属性中构建选项卡中可用的设置和目标,但没有帮助,你可能需要使用更强大的工具,尝试在IIS的应用程序池级别处理此问题。 尝试打开你的应用程序所针对的IIS管理器,然后执行以下步骤:

1. 在IIS中打开你的可用应用程序池。

AppPool

2. 右键单击托管你的有问题的应用程序的应用程序池,然后选择“高级属性”选项。

ApplicationPoolAdvanced

3. 将“启用32位应用程序”选项设置为“True”。

Enable32BitApplications

4. 最后,重启/回收你的应用程序池以使这些更改生效。
Recycle

我发现这应该可以解决大多数情况下的问题,但是你可能需要先查看一些性能方面的考虑因素,然后再进行此更改。 主要的一个是内存可用性/访问更大的可能内存空间。 如果你正在使用这种方法,你可能需要阅读 Stack Overflow上关于在IIS中使用此设置的相关讨论,以了解一些其他可能的副作用。

更多信息

如果你想了解更多关于32位和64位进程如何在CLR中相互交互的信息,我鼓励你阅读 Scott Hanselman关于相同问题的文章。 Scott将这篇文章描述为“晦涩难懂”,但同样,如果你对此感兴趣,它绝对值得一读,并且深入探讨了很多细节。

© . All rights reserved.