1

我知道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
4

4 回答 4

3

我会这样写表格:

     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。

于 2012-04-15T12:34:07.800 回答
2

该表是正确的,只要您的“运行”列指的是操作系统的位数,而不是 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
于 2012-04-15T12:27:34.657 回答
1

你必须以正确的顺序得到这个。将代码编译为 IL 时,可以选择 32、64 或 Any CPU。当 IL 将 JIT 编译为本机时,它会查看它在 PE 标头中)。如果您强制使用位数,它将 JIT(除非您强制使用 64 位并且您使用的是 32 位操作系统!)到操作系统的位数。

所以 sizeof 会告诉你你的 IL 已经编译成的本机代码的位数。

您不能依靠它来告诉您处理器的位数(64 位芯片上的 32 位操作系统)

并且您不能依靠它来告诉您操作系统的位数(64 位操作系统上的 32 位进程)

如果它返回为 8,那么您在 64 位操作系统上,因此必须在 64 位芯片上,因为没有其他方法可以发生,直到我们得到 128 位芯片和操作系统......

如果它返回 4,那么您必须进行不同的检查以发现操作系统或芯片的位数。

于 2012-04-15T13:57:54.217 回答
0

它取决于操作系统平台,而不是目标编译类型。

于 2012-04-15T12:29:42.420 回答