C#从32位系统迁移到64位系统的问题
本文转载自:http://www.cnblogs.com/xiaofengfeng/archive/2012/02/13/2349388.html,感谢原创作者!
前段用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位系统下的程序还得花很大功夫才行。