32,64位平台的编码设置技巧
【原文链接】
为了保证能够兼容32和64 两个平台.我在调用.NET程序设置编译选项为AnyCpu方式.却发现。net抛出如下异常信息:
Unhandled Exception:
System.BadImageFormatException: Could not load file or assembly 'SourceCode.HostClientAPI, Version=4.0.0.0, Culture=neutral, PublicKeyToken =16a2c5aaaa1b130d' or one of its dependencies. An attempt was made to load a program with an incorrect format. File name: 'SourceCode.HostClientAPI, Version=4.0.0.0, Culture=neutral, PublicKeyToken=16a2c5aaaa1b130d'
也就是你现在看到的System.BadImageFormatException异常.针对这个问题.官方MSDN上说的很详细.Visual Studio的编译选项 build中的platform存在有3个选项X64、Any CPU和x86。X86表示只能在32位环境下运行,X64表示只能在64位环境下运行,Any CPU表示你的程序集可以根据环境变化适应32位还是64位,但是如果你的程序集依赖于一个x86选项编译的程序集类似调用一个win32 C++ DLL,哪么你的程序集只能选择X86进行编译,而不能选择Any CPU编译,如果使用Any CPU编译.则这个时候会抛出System.BadImageFormatException异常信息.
而真正的原因是.如果你采用Anycpu方式进行编译.那么在64位机器默认的运行就是64位的,通常这情况是assembly需要调用一个32的COM库,只要用x86编译,那么程序就是以32位的程序,依靠wow64来运行的,就可以在64位系统上运行。所以,如果assembly需要使用win32库的话。正确的做法是把编译的选项设置X86来编译.即可.唯一点需求.保证调用的C++ DLL编译版本和调用版本一致才是原则所在.这样一来在32和64位则不会爆出如上异常问题.
在官方文档说了两个意外情况. 也是值得参考的.
如果您的应用程序使用了 32 位组件,请确保该应用程序始终采用 32 位应用程序的运行方式。
如果应用程序项目的“平台目标”属性设置为 AnyCPU,则编译后的应用程序在 64 位或 32 位模式中均可运行。如果采用 64 位应用程序运行方式,则实时 (JIT) 编译器便会生成 64 位本机代码。如果应用程序依赖于某个 32 位托管组件或非托管组件,则在 64 位模式中无法加载该组件。若要纠正此问题,请将项目的“平台目标”属性设置为 x86,然后重新编译。 |