C#从32位系统迁移到64位系统的问题
2012-02-13 14:32
295 查看
前段用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位系统下的程序还得花很大功夫才行。
首先是把该程序支持到 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位系统下的程序还得花很大功夫才行。
相关文章推荐
- C#从32位系统迁移到64位系统的问题
- C#从32位系统迁移到64位系统的问题
- C#程序从32位系统迁移到64位系统的问题
- C#判断系统是32位还是64位
- C# 判断32位还是64位系统的一个简单方法(当然目标平台不能是x86)
- ubuntu16.04 64位系统使用32位交叉编译器 的问题
- C# 32位/64位系统下程序读写注册表之差异
- C++,CLR,C#的DLL和EXE的32位程序,如何在64位系统上使用
- C# 32位程序访问64位系统注册表
- 开博第一篇——32位系统部署到64位下常见问题及解决
- C# 如何判断系统是32位还是64位
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- 在64位系统下安装32位ODBC驱动问题How to install and configure a 32 bit ODBC driver on a 64 bit Operating System?
- ePO从32位系统迁移至64位系统
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- C#获取32位或者64位系统安装软件信息
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- centos7 64位系统安装32位jdk运行hudson报错问题
- iPhone5s 等 64位真机 运行 带有百度地图等 仅支持32位系统API和SDK的问题
- Win10下python3和python2同时安装并解决pip共存问题 特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似。 使用python开