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

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

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

一些差异:

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

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

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

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

当使用x86托管代码时,x64托管代码将使用流式SIMD扩展(SSE)进行双/浮点计算,而不是x87 浮点单元(FPU) 。