当我进行一些 P/Invoke 或 COM InterOP 时,我经常会遇到 IntPtr。所以这里有几个问题:
大家都说IntPtr是一个struct,那么它里面有什么呢?我只能想到一个32位/64位整数,这是它指向的地址。还有什么吗?
IntPtr 位于哪里?如果它是一个结构,我相信它应该位于 CLR托管堆栈中。但是,如果我在执行 p/invoke 时将 IntPtr 传递给非托管方法怎么办,它不是传递给非托管堆栈吗?它会被复制到非托管堆栈吗?进程地址空间中有托管堆和非托管堆,这种分离也存在于进程地址空间中吗?进程的堆栈?
最佳答案
IntPtr 只是一个保证为指针大小的整数。因此,它通常用于在使用指针被认为“不安全”的上下文中包含指针。
但是,就像指针一样,它只是一个数字。如果它包含地址,则该地址在此过程中可能有效或无效。它可以是对齐的或未对齐的,它可以是当前线程的堆栈或另一个线程的堆栈或托管堆或某些非托管堆上的位置。这只是一个数字;将该数字解释为指针是否有意义或安全由您决定。
关于.net - 关于 IntPtr 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3922219/