gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:51:54 24 4
gpt4 key购买 nike

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

通常 32 位应用程序在 64 位机器上运行时会出现问题,反之亦然。我知道我可以将整数声明为 int32 和 int64(当然 32 位系统上的 int64 会产生问题)。编写 32 位或 64 位或同时兼容 32 位和 64 位的应用程序之间还有其他区别吗?

最佳答案

一些区别:

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

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

  3. IntPtr 等特定于平台的类型将具有不同的大小。这可能是假定固定大小(序列化、编码(marshal)处理)的代码中的一个问题。

  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# 应用程序中看到这一点。

关于c# - 32 位和 64 位 .NET 应用程序的区别(4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com