64位系统上设置编译平台为x86的项目编译在特定的情况下比如当一个窗体上放有包含了图像的ImageList之后,ResGen就会产生这种问题

随笔 - 1  文章 - 0  评论 - 3

未能加载文件或程序集“****”或它的某一个依赖项。试图加载格式不正确的程序。解决方案总结

当这个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只需将最终的执行文件目标平台设置为x86:

这样即可正常编译。

程序最终运行的平台,是根据可执行文件的设置来的,因此库中设置为AnyCPU不会影响到最终程序的运行,运行依然是在x86之下。

但是如果引用的DLL有仅32位的,那这种方法就不行了,解决办法http://support.microsoft.com/kb/2028833,详见MSBuild 4.0 or Visual Studio 2010 may fail to compile a 32-bit application targeted for .Net Framework 3.5, 3.0 or 2.0 on x64 machine

 详细解决步骤如下:

    1、关闭所有Visual Studio;

    2、以管理员的身份打开VS2010的命令提示窗口;

    3、更改目录至"<system_drive>:\Program Files (x86)\Microsoft SDKs\Windows\v<x.xx>\bin\”下面;

    4、输入该命令corflags /32bit+ ResGen.exe /force,执行;

    5、使用记事本打开<project_name>.csproj文件;

    6、在PropertyGroup下添加<ResGenToolArchitecture>Managed32Bit</ResGenToolArchitecture>,保存,关闭退出。

  现在在VS2010中重新打开原先的项目,编译通过,可以正确运行了!

  步骤做完后就能运行的原因是,此时ResGen就是以32位模式运行了,而不是64位,因此便可以加载标记为仅32位的程序集了。代价是——它就再也无法编译标记为仅64位模式的程序集了。

  对于该问题,还有另一个解决办法,打开项目属性页面,选择应用程序选项卡,设置目标框架为.NET Framework 4 。(由于框架限制,这个没测试)

  有关CorFlags.exe转换工具的详细信息请参见http://msdn.microsoft.com/zh-cn/library/ms164699.aspx

  有关Resgen.exe资源文件生成器的详细信息请参见http://msdn.microsoft.com/zh-cn/library/ccec7sz1.aspx

参考园子文章 http://www.cnblogs.com/nicch/archive/2010/05/25/building_cross_platform_application_on_64bit_msbuild.html

       http://www.cnblogs.com/hans_gis/archive/2011/07/22/2114013.html

时间: 2024-12-29 15:45:16

64位系统上设置编译平台为x86的项目编译在特定的情况下比如当一个窗体上放有包含了图像的ImageList之后,ResGen就会产生这种问题的相关文章

centos 6.5 64位 系统时间设置

现在服务器上的系统时间是: [~]#dateThu Jul 30 11:44:01 CST 2015 现在硬件时间是: [~]#clockThu 30 Jul 2015 11:44:22 AM CST  -0.031420 seconds . 具体步骤是: [root@localhost  ~]# tzselect Please identify a location so that time zone rules can be set correctly.Please select a con

【转】将 Linux 应用程序移植到 64 位系统上

原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软件已经变得比以前更为重要.在本文中,您将学习如何在进行语句声明.赋值.位移.类型转换.字符串格式化以及更多操作时,防止出现可移植性缺陷. 0 评论: Harsha S. Adiga, 软件工程师, IBM 2006 年 5 月 18 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个

iOS上应用如何兼容32位系统和64位系统

在苹果推出iPhone5S时,64位的应用就走到了眼前.当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位. 我记得自己刚刚接触电脑时还有16位的系统,指针的寻址范围还是16位的.当年用TurboC时,还要根据应用的大小选择是tiny模式还是其他.后来很长一段时间使用32位的模型编程,4G是牢牢记住的一个边界条件.而现在,64位走到了眼前. 就如同16位转向32位一样,硬件肯定是最先推出的,SDK也会跟进,然后各种第三方的应用才会逐步跟进,这个过程一般

【OpenCV基础】Win7 64位系统上OpenCV的安装与在VS2013上的配置

OpenCV(Open Source Computer Vision Library)是一个开源的跨平台开源计算机视觉库,能在Windows.Linux.Mac等平台上运行,使用C语言与C++编写而成,轻量且高效. 下面介绍一下怎么在Win7 64位系统上安装OpenCV以及如何利用VS2013进行基于OpenCV的程序开发.OpenCV的函数库封装在了lib和dll里,并且有两种版本,一种是x86(32位),一种是x64(64位),我在64位系统上使用32位的库没有成功,所以这个教程只适用于W

64位系统上运行32位程序能否申请到8G内存?

申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来讲,申请8G的存储空间没有任何意义,因为32位的程序最大寻址空间只有4G,32位程序在编译之后的机器代码也只有32位的寻址数(指针占4个字节),因此申请8G的空间是没啥意义的,而且一般系统都会为每个进程设置一些资源限制,对于32位程序其能申请的内存量也远远小于4G可以看一下下面这个表操作系统内部数据结构限制对比 IT168评测中心 分组 限制 64位Windows限制 类别 单个进程虚拟空间 4GB 16TB 用

win7在64位系统下编译openssl

以前在笔记本上配置过openssl-0.9.8g版本,今天在公司的台式机上配置死活没配置成功,机器的系统是win7,64位,编译openssl-1.0.1e出现各种莫名的错误,最后无意中编译了1.0.0.a版本编译成功了. 如果出现ml找不到的时候,直接在vc10.0/bin下拷贝就好. 参考文章:http://blog.chinaunix.net/uid-20479991-id-216269.html win7在64位系统下编译openssl,布布扣,bubuko.com

关于在64位系统上,使用APlayer,运行报错“找不到指定的模块”

使用APlayer开发了一个C#程序,原先开发电脑是32位的,安装电脑也是32位,只需要将相应的文件打包,然后在system32文件夹中放入atl71.dll和D3DX9_43.dll,项目运转正常.但后来因为系统升级,换了台win10 64位的系统,开发时只需将项目的平台换成x86,但是打包后安装却报错,且system32下的两个dll已存在.经过一天的摸索,因为64位系统有个SysWOW64  文件夹,将所需的两个dll放入此文件夹,问题得已解决. 网上查出两个文件夹的区别 \Windows

[单选题]64位系统上,定义的变量int *a[2][3]占据的——字节

4 12 24 48 正确答案: 很遗憾,没答对,再接再厉! 答案解析 在64位系统上,一个指针占8个字节.在32位系统上,一个指针占4个字节.注意无论在32位还是在64位系统占,int均为4个字节.

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

众所周知,取系统的安装时间可取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion的子项InstallDate,此值是个DWORD类型的UnixStamp.  但是在64位系统上有所不同(仅测试了win7.win8),默认情况下32程序在64位机器上访问的是下面这个地址HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion