检查不同环境下的 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

检查不同环境下的 32 位通过代码

我会这样写表格:

     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,而不是目标编译类型。