在64bit系统上开发一些特定软件的时候,往往需要将目标平台由AnyCPU调整为x86(32位平台),比如当内嵌浏览器,或使用一些COM组
件的时候。在VS2008中,直接新建一个解决方案平台会将解决方案中所有项目(包括可执行程序和库)全部调整为目标x86。当项目由vs2008升级到
vs2010或特定的情况下,可能会发生编译失败的情况。比如当一个窗体上放有包含了图像的ImageList之后,ResGen会发生RG0000这样
的错误:
Error 3357
未能加载文件或程序集“file:///D:/计算机开发/个人项目/_公用类库_/FSLib.AppFramework/bin/x86/Debug
/FSLib.AppFramework.dll”或它的某一个依赖项。试图加载格式不正确的程序。 行 191,位置 5。
当这个ImageList中没有图像时编译也是正常的,但是一旦编译就会引发这样的异常。
这
个错误产生的原因在于,VS2010内部使用的编译器中,无论是32位还是64位的编译组件,都是纯IL的,也就是在64位系统中是以64位模式运行,这
与当前项目使用的平台设置无关。当编译的组件引用了一个标记为x86的库(仅32位模式)时,编译组件便会发生错误,无法加载,从而导致编译失败。
这个问题发生在以下的情况中:
1,在64位操作系统上使用任何版本的MSBuild编译引用了仅32位组件的.Net 3.5的项目;
2,使用64位MSBuild编译引用了仅32位组件的项目;
3,使用32位MSBuild编译引用了仅64位组件的项目。
要解决这个问题,可以在解决方案管理器中,将所有的库的目标平台全部设置为 AnyCPU,而最终的执行文件目标平台才设置为x86:
这样即可正常编译。
程序最终运行的平台,是根据可执行文件的设置来的,因此库中设置为AnyCPU不会影响到最终程序的运行,运行依然是在x86之下。
【扩展阅读】
Building on Cross targeting scenarios and 64-bit MSBuild
本日志备份自 QQ 空间,原文地址:http://user.qzone.qq.com/286495995/blog/1274798840。