所以我已经多次看到这个关于在 C# 中获取引用对象的物理地址的问题,普遍的共识似乎是这是不可能的,因为你不能调用 GCHandle.Alloc
与 GCHandleType.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/