zoukankan      html  css  js  c++  java
  • 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位系统下的程序还得花很大功夫才行。

  • 相关阅读:
    C# WinForm dataGridView 技巧小结
    Win7设置局域网共享
    vs2010快捷键大全
    C# WebBrowser.DocumentCompleted 多次调用解决方法
    为应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制
    VB高清图标制作方法
    sqlite 中文排序
    一个vbs文件将指定文件夹下的文件名输出到指定文件夹下
    用DOS命令获取文件列表
    文件搜索神器 Everything
  • 原文地址:https://www.cnblogs.com/youfal/p/2832471.html
Copyright © 2011-2022 走看看