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





0/5 (0投票)
99个问题,但不是缺少一位
如果你曾经在涉及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位)之间反复切换,并尝试无数次重新构建和运行你的应用程序。
然后你可能会说“好吧,Any CPU设置应该有效”,然后你尝试一下,但再次遇到之前遇到的相同错误。 这并非总是如此,因为我发现这些设置中的一个偶尔可能会起作用,但成功率可能因用户和应用程序而异。
求助于IIS
如果你尝试了解决方案属性中构建选项卡中可用的设置和目标,但没有帮助,你可能需要使用更强大的工具,尝试在IIS的应用程序池级别处理此问题。 尝试打开你的应用程序所针对的IIS管理器,然后执行以下步骤:
1. 在IIS中打开你的可用应用程序池。
2. 右键单击托管你的有问题的应用程序的应用程序池,然后选择“高级属性”选项。
3. 将“启用32位应用程序”选项设置为“True”。
我发现这应该可以解决大多数情况下的问题,但是你可能需要先查看一些性能方面的考虑因素,然后再进行此更改。 主要的一个是内存可用性/访问更大的可能内存空间。 如果你正在使用这种方法,你可能需要阅读 Stack Overflow上关于在IIS中使用此设置的相关讨论,以了解一些其他可能的副作用。
更多信息
如果你想了解更多关于32位和64位进程如何在CLR中相互交互的信息,我鼓励你阅读 Scott Hanselman关于相同问题的文章。 Scott将这篇文章描述为“晦涩难懂”,但同样,如果你对此感兴趣,它绝对值得一读,并且深入探讨了很多细节。