使用PInvoke时,我注意到我们需要使用`IntPtr`来引用Windows句柄。我想知道为什么不能只使用`int`来表示句柄?我的理解是句柄只是一个整数值。
Windows句柄被定义为本地机器指针大小的整数。这是为了让它们在需要时可以秘密地成为指针。(句柄可能不是指针,但如果操作系统实现者认为有必要,则允许它成为指针。出于安全考虑,它们通常实际上不是指针; 如果它们实际上是指针,人们就很容易滥用系统。)
C#中定义的int是32位整数,在64位机器上过小。IntPtr被定义为可以容纳机器大小指针的整数。这就是为什么在与句柄交互时总是使用IntPtr。
处理句柄是指针大小值。
在64位平台上,它们的宽度为8个字节。
句柄的大小取决于机器体系结构(32位/64位)。IntPtr
会处理这个问题。
句柄实质上是系统级指针,而指针不会隐式转换为int类型。它本身就是一种类型。因此,在.NET中有IntPtr
来表示句柄类型。