64位系统vs开发环境中imagelist无法编译的解决办法,可行
来源:互联网 发布:2015网络作家富豪榜 编辑:程序博客网 时间:2024/05/17 07:58
原帖地址http://www.cnblogs.com/ggcc/archive/2011/11/25/2262960.html
未能加载文件或程序集“****”或它的某一个依赖项。试图加载格式不正确的程序。解决方案总结
64位系统上设置编译平台为x86的项目编译在特定的情况下比如当一个窗体上放有包含了图像的ImageList之后,ResGen就会产生这种问题
当这个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
- 64位系统vs开发环境中imagelist无法编译的解决办法,可行
- 使用64位系统用vs2008开发软件,程序编译后无法连接ODBC的解决办法
- Xamarin中VS无法连接Mac系统的解决办法
- C#程序无法在64位系统下的解决办法
- 从32位QT开发环境拷贝vs-qt的工程到64位工程中遇到的问题
- 使用VC6将32位程序编译成为64位程序(这个才是可行的)
- Win10 专业版64位系统无法使用ISE软件64位版本的解决办法
- 64位系统下IIS无法运行32位程序的解决办法
- 关于VS编译时出现无法打开libcmrt.lib,libc.lib等系统常见库文件的解决办法
- VS 2008的64位编译环境的安装和使用
- VS 2008的64位编译环境的安装和使用
- VS 2012 编译64位的GDAL
- 【VS开发】【C/C++开发】vs2015编译boost 64位
- VS中MFC连接MySQL由于系统不同位(32/64)引起的错误:无法解析的外部符号 _mysql_init@4、_mysql_query
- VS中MFC连接MySQL由于系统不同位(32/64)引起的错误:无法解析的外部符号 _mysql_init@4,_mysql_query,_mysql_error
- VS中MFC连接MySQL由于系统不同位(32/64)引起的错误:无法解析的外部符号 _mysql_init@4、_mysql_query
- 64位开发环境下编译32位dll文件
- 64位开发环境下编译32位dll文件
- SVN还原以前版本
- ConcurrentModificationException异常解决办法
- android以后台service的方式获取GPRS数据
- 算法之美——循环移位(XY→YX)逆操作
- [openstack swift]多节点安装
- 64位系统vs开发环境中imagelist无法编译的解决办法,可行
- iPhone通用界面应用开发详解
- 常用的排序方法(一)
- 常用设计模式
- 青涩的思绪 泛起粉色的涟漪
- 常用的排序方法(二)
- 如何进行IT项目的需求调研
- hdu 4091 Zombie’s Treasure Chest
- 【图形化编程软件】 sikuli常用函数、简单事件操作 键盘操作 个人总结笔记