检查不同环境下的 32 位通过代码
本文关键字:代码 环境 检查 | 更新日期: 2023-09-27 18:31:14
我知道IntPtr.Size
可以检查64位或32位。( 8 || 4
字节
问题:
是IntPtr.Size
关于
- 操作系统平台
或
- .NET 编译版本(我可以编译到 32 或 64 )
你能检查并更正这个表格吗?
compiled to | running OS | IntPtr.Size
______________________________________
64 32 wont run
64 64 8
32 32 4
32 64 4
我会这样写表格:
target | OS | IntPtr.Size
______________________________________
x64 32 wont run
x64 64 8
AnyCPU 32 4
AnyCPU 64 8
x86 32 4
x86 64 4
强烈暗示您始终希望针对 AnyCPU 而不是 x64。 仅当您知道需要使用仅在 32 位机器代码中可用的非托管代码(通常为 COM 服务器)时,才以 x86 为目标。
该表是正确的,只要您的"运行时间"列指的是操作系统的位数,而不是 CPU 的位数。
请记住,实际上有三个选项:32、64 和 AnyCPU:
compiled to | running on | IntPtr.Size
___________________________________________
64 | 32 | won't run
64 | 64 | 8
32 | 32 | 4
32 | 64 | 4
AnyCPU | 32 | 4
AnyCPU | 64 | 8
你必须以正确的顺序得到它。将代码编译为 IL 时,可以选择 32、64 或任何 CPU。当 IL 将 JIT 编译为本机时,它会查看它在 PE 标头中)。如果你强制了位,它会(除非你强制了 64 位并且你使用的是 32 位操作系统!)到操作系统的位数。
因此,sizeof 会告诉您 IL 已编译到的本机代码的位数。
您不能依靠它来告诉您处理器的位数(32位芯片上的64位操作系统)
而且您不能依靠它来告诉您操作系统的位数(32位操作系统上的64位进程)
如果它返回为 8,那么您使用的是 64 位操作系统,因此必须在 64 位芯片上,因为没有其他方法可以发生这种情况,直到我们无论如何都达到 128 位芯片和操作系统......
如果它返回 4,那么您必须进行不同的检查以发现操作系统或芯片的位数。
它取决于操作系统platofrm,而不是目标编译类型。