.net - 关于 IntPtr 的问题

标签 .net clr

当我进行一些 P/Invoke 或 COM InterOP 时,我经常会遇到 IntPtr。所以这里有几个问题:

  • 大家都说IntPtr是一个struct,那么它里面有什么呢?我只能想到一个32位/64位整数,这是它指向的地址。还有什么吗?

  • IntPtr 位于哪里?如果它是一个结构,我相信它应该位于 CLR托管堆栈中。但是,如果我在执行 p/invoke 时将 IntPtr 传递给非托管方法怎么办,它不是传递给非托管堆栈吗?它会被复制到非托管堆栈吗?进程地址空间中有托管堆和非托管堆,这种分离存在于进程地址空间中吗?进程的堆栈?

最佳答案

IntPtr 只是一个保证为指针大小的整数。因此,它通常用于在使用指针被认为“不安全”的上下文中包含指针。

但是,就像指针一样,它只是一个数字。如果它包含地址,则该地址在此过程中可能有效或无效。它可以是对齐的或未对齐的,它可以是当前线程的堆栈或另一个线程的堆栈或托管堆或某些非托管堆上的位置。这只是一个数字;将该数字解释为指针是否有意义或安全由您决定。

关于.net - 关于 IntPtr 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3922219/

相关文章:

c# - ASP.NET Core 模型绑定(bind)和整数

c# - 如何显示两个日期之间的计算值,仅小时和分钟超过 C# 中的 24 小时差异

.net - 用于检查最新 .NET Core SDK 版本的 API 端点

sql-server - 索引如何在 SQL 用户定义类型 (UDT) 上工作?

.net - .NET CLR 的多个版本同时运行

c# - 如何在 WebApi 请求中获取 Controller 名称?

.net - 如何测试 '-'是否存在,但字符 '['和 ']'之间不存在?

.net - 沃森桶 P1

clr - 回放 WinDbg TTD 中创建某个托管对象的时刻

c# - 从程序集中删除签名