c# - 引用对象的地址在立即窗口中有效,但在编译代码中无效

标签 c# .net clr

所以我已经多次看到这个关于在 C# 中获取引用对象的物理地址的问题,普遍的共识似乎是这是不可能的,因为你不能调用 GCHandle.AllocGCHandleType.Pinned这将允许您获取固定对象的地址。

但我觉得奇怪的是,在 Visual Studio 调试器中,我可以将对象从本地窗口拖动到内存调试窗口,并查看引用对象的地址和内存。我什至可以在立即窗口中输入 &obj并获取对象的实际地址(该地址正确对应于“内存”窗口中显示的地址)。

但是为什么我无法在编译的代码中进行相同的调用...即:

object someObject = new Object();
&obj; // Compiler Error: Cannot take the address of, get the size of, or declare a pointer to a managed type ('object')

如何让 Immediate\Memory Window 获取托管类型的地址,甚至显示内存布局,但 C# 却无法做到这一点?有什么方法可以获取 C# 中引用对象的实际地址吗?

最佳答案

调试器比您自己的代码有很大的优势。它可以在进程卡住且没有代码运行时查看进程状态。因此,获取对象的地址不是问题,垃圾收集器不会运行来使其无效。

关于c# - 引用对象的地址在立即窗口中有效,但在编译代码中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12644430/

相关文章:

c# - 在同一解决方案/项目中混合 .NET 3.5 与 4/4.5 程序集

.net - 如何在 C++ 上从 CLR 捕获事件

c# - .Net CLR 卸载与关闭?

c# - 在 aws eb 上存储 asp.net core 2 的连接字符串

javascript - 如何更改日期选择器语言

c# - 是否可以找到一些全面比较VB和C#语法差异的文章(最好是2010版)?

c# - 一般如何在 DateTimePicker-Control/Controls 中获取按钮的宽度?

c# - 等待全部限制

c# - 如何仅匹配正则表达式中的第一个数字

c# - Appbar 后面的弹出窗口