本鱼拟成立工作室承接项目开发/软件定制/云设施开发运维/办公设备技术支持等,如您有相关需求,欢迎来询 | ::博客文章推荐::

64位系统上设置编译平台为x86的VS2008项目升级到VS2010后编译失败的原因和解决办法

: 开发工具 木魚 3931℃ 0评论

在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

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址