32位和64位.NET(4)应用程序有什么区别?
通常,32位应用程序在64位机器上运行时存在问题,反之亦然。我知道可以将整数声明为int32和int64(在32位系统上肯定会出现问题)。在编程32位或64位或同时兼容32位和64位的应用程序时,是否存在其他差异?
32位和64位.NET(4)应用程序有什么区别?
通常,32位应用程序在64位机器上运行时存在问题,反之亦然。我知道可以将整数声明为int32和int64(在32位系统上肯定会出现问题)。在编程32位或64位或同时兼容32位和64位的应用程序时,是否存在其他差异?
32位和64位应用程序只能加载相同位数的DLL。如果您的平台目标是“Any CPU”并且引用或P/Invoke 32位本机DLL,则这可能会成为托管项目的问题。当您的“Any CPU”程序在64位计算机上运行时,由于您的应用程序作为64位进程运行,因此当它尝试加载32位本机DLL依赖项时,它将抛出异常(BadImageFormatException
)并可能崩溃。
还存在文件系统和注册表问题。除非先禁用Windows文件系统重定向(请参见Wow64DisableWow64FsRedirection
),否则尝试从C:\Program Files
读取的WOW64进程最终会被重定向到C:\Program Files (x86)
。对于Windows 7之前的版本,还存在类似于上述文件系统重定向问题的注册表反射问题。MSDN文章Registry Reflection解释得很好。
平台特定类型如IntPtr
将具有不同的大小。这可能是假定固定大小的代码(序列化,马赛克)中的问题。
GAC中有独立的32位和64位文件物理目录。对于我的系统,它们位于C:\Windows\Microsoft.NET\assembly\GAC_32
和C:\Windows\Microsoft.NET\assembly\GAC_64
。
32位和64位应用程序的虚拟地址空间大小不同。对于32位应用程序,大小为2 GB(默认)或3 GB(启用4GT)。对于64位应用程序,大小为8 TB。 32位地址空间可能是非常大的应用程序的限制。
有一些不太常见的问题,许多进程间Win32调用在32位和64位进程之间无法工作。例如,尝试从64位进程上调用ReadProcessMemory
的32位进程可能会失败。对于WriteProcessMemory
,EnumProcessModules
和许多类似方法也是如此。如果您尝试使用System.Diagnostics.Process.Modules
API从32位应用程序枚举64位应用程序的模块,则可以在C#应用程序中看到这一点。
IntPtr
不是唯一安全的平台相关类型吗? - stakx - no longer contributing