新闻中心
业内资讯
充电站
企业新闻
新闻内容 本站公告: 公司快速发展中,需要有志有能力有成功梦想的年青人,加盟等你来! 2017年底新品即将发布,正式上线!
 
32,64位平台的编码设置技巧
发布者:BETVSYS  发布时间:2013-10-24 22:15:24  阅读:905次 【字体:

32,64位平台的编码设置技巧

【原文链接

为了保证能够兼容32和64 两个平台.我在调用.NET程序设置编译选项为AnyCpu方式.却发现。net抛出如下异常信息:

Unhandled Exception:

System.BadImageFormatException: Could not load file or assembly 'SourceCode.HostClientAPI, Version=4.0.0.0, Culture=neutral, PublicKeyToken
=16a2c5aaaa1b130d' or one of its dependencies. An attempt was made to load a program with an incorrect format.
File name: 'SourceCode.HostClientAPI, Version=4.0.0.0, Culture=neutral, PublicKeyToken=16a2c5aaaa1b130d'

也就是你现在看到的System.BadImageFormatException异常.针对这个问题.官方MSDN上说的很详细.Visual Studio的编译选项 build中的platform存在有3个选项X64、Any CPU和x86。X86表示只能在32位环境下运行,X64表示只能在64位环境下运行,Any CPU表示你的程序集可以根据环境变化适应32位还是64位,但是如果你的程序集依赖于一个x86选项编译的程序集类似调用一个win32 C++ DLL,哪么你的程序集只能选择X86进行编译,而不能选择Any CPU编译,如果使用Any CPU编译.则这个时候会抛出System.BadImageFormatException异常信息.

而真正的原因是.如果你采用Anycpu方式进行编译.那么在64位机器默认的运行就是64位的,通常这情况是assembly需要调用一个32的COM库,只要用x86编译,那么程序就是以32位的程序,依靠wow64来运行的,就可以在64位系统上运行。所以,如果assembly需要使用win32库的话。正确的做法是把编译的选项设置X86来编译.即可.唯一点需求.保证调用的C++ DLL编译版本和调用版本一致才是原则所在.这样一来在32和64位则不会爆出如上异常问题.

在官方文档说了两个意外情况. 也是值得参考的.

如果您的应用程序使用了 32 位组件,请确保该应用程序始终采用 32 位应用程序的运行方式。

如果应用程序项目的“平台目标”属性设置为 AnyCPU,则编译后的应用程序在 64 位或 32 位模式中均可运行。如果采用 64 位应用程序运行方式,则实时 (JIT) 编译器便会生成 64 位本机代码。如果应用程序依赖于某个 32 位托管组件或非托管组件,则在 64 位模式中无法加载该组件。若要纠正此问题,请将项目的“平台目标”属性设置为 x86,然后重新编译。

 
 

打印本页 || 关闭窗口
友情链接:   360导航   |   hao123   |   智慧工地   |   中安网   |   中国雅虎   |  
SSONE高速公路应急管理平台 智能视频报警系统 智能移动3G视频报警仪 视频分析仪 视频摘要 视频检索 监狱智能分析 高速事件检测 智能家居安防 智能安防 打架 徘徊 逆行 周界入侵 客流统计 车流统计 道路违章抓拍 联动跟踪
武汉倍特威视系统有限公司 2017 版权所有 鄂ICP备14008970号 电话:027-68784993
Copyright 2017-2017