您的位置:首页 > 编程语言 > C#

C#程序从32位系统迁移到64位系统的问题

2011-12-09 09:45 288 查看
前段用C#做了个程序,现在要把程序支持64位系统。

首先是把该程序支持到 Windows Server 2003 和 Windows Server 2008两个系统,由于我的程序是在XP上测试编译的,直接拿过去不会出什么问题吧,

但是在运行的时候,老是报错。没办法,在Server 2003上装了VS,一步步调试,发现每当我执行到调用C++的dll时候,其中有一句就会报错:

尝试读取或写入受保护的内存。这通常指示其他内存已损坏

但是我之前的几句调用dll的都执行通过了,而且在XP上也运行良好啊。

试了N久也不行,换参数等等方法也都以失败告终。

先不管了,用最笨的方法,你执行不通过我就绕过,还好可以用其他的方法实现目的。这样,32平台下都通过了。

按理说,一般32位的程序64位系统都是可以运行的。但是,真正移植的时候,却还是出了问题。还是在调用C++的dll时候报

尝试读取或写入受保护的内存。这通常指示其他内存已损坏

的错误,而且这次还变本加利,一句都通过不了,真是费解。

这到底是怎么回事呢?用64位的库也不行,难道是内存机制的差异?

最终搜了N久,就在我最终绝望的时候,看到了一篇文章,讲的时在从32位系统移植到64位系统时候的一些问题,那篇文章里特意把编译时候的platform设置为“x86”。咦,既然是要在64位下运行,为什么还要设置为“x86”呢?

不报希望的我试了下,结果竟然通过了。

问题的原因就在这里啊。然后查了点资料,简单的放在这里。

VS编译目标platform有3个选项:AnyCPU,x86和x64。

如果一个程序被编译成AnyCPU,那么程序将包含2套相同逻辑的程序,一套在32位系统上用,另一套在64位系统上用。问题的原因就在这里。

如果你是在32位系统上用AnyCPU编译了代码,那么代码调用的时32位COM,在32位系统上是以32位方式运行,32位APP调用32位COM,着当然没问题。但是如果其他人在64位系统上调用你的程序,则程序是以64位APP调用32位COM。

当然,这里我把编译时候的platform设置为“x86”,只是生成了特定于32位Intel x86兼容处理器平台的代码,所生成的程序集是基于PE32格式,可运行与WOW64子系统中,所以当然也就可以在64位系统下运行了。

要想写原生的64位系统下的程序还得花很大功夫才行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: