32位和64位.NET(4)应用程序之间有什么区别?
32位应用程序通常在64位计算机上运行时遇到问题,反之亦然。我知道我可以将整数声明为int32和int64(当然32位系统上的int64会产生问题)。编程32 OR 64位或32位和64位兼容应用程序之间是否存在其他差异?
答案 0 :(得分:29)
一些差异:
32位和64位应用程序只能加载相同位的DLL。如果您的平台目标是“任何CPU”并且您引用或P/Invoke 32位本机DLL,则这可能是托管项目的问题。由于您的应用程序以64位进程运行,因此当您的“任何CPU”程序在64位计算机上运行时会出现此问题。当它尝试加载32位本机DLL依赖项时,它将抛出异常(BadImageFormatException
)并可能崩溃。
还存在文件系统和注册表问题。试图从C:\Program Files
读取的WOW64进程最终会被重定向到C:\Program Files (x86)
,除非它首先禁用Windows文件系统重定向(请参阅Wow64DisableWow64FsRedirection
)。对于Windows 7之前的Windows版本,还存在类似于上面提到的文件系统重定向问题的注册表反射问题。 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#应用程序中看到这一点。
答案 1 :(得分:3)
一般来说,我认为托管代码不应该有任何问题。
潜在问题可能来自非托管代码。例如,因为32位和64位系统中的变量大小不同,所以指针也不同等。例如,C / C ++中int变量的大小取决于系统。至于已经提到的托管代码,WoW可以处理。
答案 2 :(得分:2)
x64托管代码将使用Streaming SIMD Extensions (SSE)进行双/浮点计算而不是x87 Floating Point Unit (FPU)。
答案 3 :(得分:0)
除了其他答案,我还要补充一点:我们可以在64位上运行32位系统的软件,但是相反是不可能的!