32位和64位.NET(4)应用程序之间的差异

时间:2010-08-22 08:17:58

标签: c# .net vb.net 64-bit 32-bit

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

32位应用程序通常在64位计算机上运行时遇到问题,反之亦然。我知道我可以将整数声明为int32和int64(当然32位系统上的int64会产生问题)。编程32 OR 64位或32位和64位兼容应用程序之间是否存在其他差异?

4 个答案:

答案 0 :(得分:29)

一些差异:

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

  2. 还存在文件系统和注册表问题。试图从C:\Program Files读取的WOW64进程最终会被重定向到C:\Program Files (x86),除非它首先禁用Windows文件系统重定向(请参阅Wow64DisableWow64FsRedirection)。对于Windows 7之前的Windows版本,还存在类似于上面提到的文件系统重定向问题的注册表反射问题。 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#应用程序中看到这一点。

答案 1 :(得分:3)

一般来说,我认为托管代码不应该有任何问题。

潜在问题可能来自非托管代码。例如,因为32位和64位系统中的变量大小不同,所以指针也不同等。例如,C / C ++中int变量的大小取决于系统。至于已经提到的托管代码,WoW可以处理。

答案 2 :(得分:2)

在使用x86托管代码时,

x64托管代码将使用Streaming SIMD Extensions (SSE)进行双/浮点计算而不是x87 Floating Point Unit (FPU)

答案 3 :(得分:0)

除了其他答案,我还要补充一点:我们可以在64位上运行32位系统的软件,但是相反是不可能的!