32位和64位.NET(4)应用程序的区别

11

32位和64位.NET(4)应用程序有什么区别?

通常,32位应用程序在64位机器上运行时存在问题,反之亦然。我知道可以将整数声明为int32和int64(在32位系统上肯定会出现问题)。在编程32位或64位或同时兼容32位和64位的应用程序时,是否存在其他差异?


3
这可能会有所帮助 - http://stackoverflow.com/questions/3102765/net-3-5-web-application-porting-to-64bit-potential-issues - Jagmag
1
可能是用于C#开发的64位工具的重复问题。 - Hans Passant
4个回答

30
一些不同之处:
  1. 32位和64位应用程序只能加载相同位数的DLL。如果您的平台目标是“Any CPU”并且引用或P/Invoke 32位本机DLL,则这可能会成为托管项目的问题。当您的“Any CPU”程序在64位计算机上运行时,由于您的应用程序作为64位进程运行,因此当它尝试加载32位本机DLL依赖项时,它将抛出异常(BadImageFormatException)并可能崩溃。

  2. 还存在文件系统和注册表问题。除非先禁用Windows文件系统重定向(请参见Wow64DisableWow64FsRedirection),否则尝试从C:\Program Files读取的WOW64进程最终会被重定向到C:\Program Files (x86)。对于Windows 7之前的版本,还存在类似于上述文件系统重定向问题的注册表反射问题。MSDN文章Registry Reflection解释得很好。

  3. 平台特定类型如IntPtr将具有不同的大小。这可能是假定固定大小的代码(序列化,马赛克)中的问题。

  4. GAC中有独立的32位和64位文件物理目录。对于我的系统,它们位于C:\Windows\Microsoft.NET\assembly\GAC_32C:\Windows\Microsoft.NET\assembly\GAC_64

  5. 32位和64位应用程序的虚拟地址空间大小不同。对于32位应用程序,大小为2 GB(默认)或3 GB(启用4GT)。对于64位应用程序,大小为8 TB。 32位地址空间可能是非常大的应用程序的限制。

  6. 有一些不太常见的问题,许多进程间Win32调用在32位和64位进程之间无法工作。例如,尝试从64位进程上调用ReadProcessMemory的32位进程可能会失败。对于WriteProcessMemoryEnumProcessModules和许多类似方法也是如此。如果您尝试使用System.Diagnostics.Process.Modules API从32位应用程序枚举64位应用程序的模块,则可以在C#应用程序中看到这一点。


很棒的回答!问题:IntPtr不是唯一安全的平台相关类型吗? - stakx - no longer contributing

3

3
一般来说,我认为您不应该在托管代码上遇到任何问题。
潜在的问题可能来自非托管代码。例如,因为32位和64位系统中变量大小不同,指针也不同等。例如,在C / C ++中int变量的大小取决于系统。至于上述已经提到的托管代码,WoW可以处理这个问题。

0
除了其他答案之外,我想再补充一点:我们可以在64位系统上运行32位软件,但反过来则不可能!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接