使用PInvoke时,我注意到我们需要使用IntPtr
来引用Windows句柄。我想知道为什么不使用int
来处理句柄?我对句柄的理解是它只是一个整数值。
答案 0 :(得分:18)
Windows句柄定义为本机计算机指针大小的整数。这样他们就可以秘密地成为指针,如果他们需要的话。 (句柄可能不是指针,但如果操作系统实现者认为必要,则允许是一个。出于安全原因,它们通常不是指针;它如果它们实际上是指针,那么人们就很容易滥用系统。)
C#中的int定义为32位整数,在64位机器上太小。 IntPtr定义为可以保存机器大小指针的整数。这就是为什么在与句柄互操作时总是使用IntPtr。
答案 1 :(得分:10)
句柄是指针大小的值。
在64位平台上,它们的宽度为8个字节。
答案 2 :(得分:4)
句柄的大小取决于机器架构(32/64位)。 IntPtr
会照顾到这一点。
答案 3 :(得分:2)
句柄本质上是系统级指针,指针不会隐式地转换为int。它本身就是一种类型。这就是为什么你在.NET中用IntPtr
来表示句柄类型。