2024年8月24日发(作者:)

64位系统上设置编译平台为x86的VS2008项目升级

到VS2010后编译失败的原因和解决办法

在 64bit系统上开发一些特定软件的时候,往往需要将目标平台由AnyCPU调

整为x86(32位平台),比如当内嵌浏览器,或使用一些COM组件的时 候。在

VS2008中,直接新建一个解决方案平台会将解决方案中所有项目(包括可执行

程序和库)全部调整为目标x86。当项目由vs2008升级到 vs2010或特定的情

况下,可能会发生编译失败的情况。比如当一个窗体上放有包含了图像的

ImageList之后,ResGen会发生RG0000这样 的错误:

Error 3357 未能加载文件或程序集“file:///D:/计算机开发/个人项目

/_公用类库_/mework/bin/x86/Debug /”

或它的某一个依赖项。试图加载格式不正确的程序。 行 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之下。