.NET:显示对象的存储位置或地址?
-
30-09-2019 - |
题
有没有办法获得对象的“地址”?这是出于演示目的 我知道这是一个坏主意 通常,如果它完全有效,那么 unsafe
代码。调整了该项目以允许不安全的代码。但是我的尝试不成功。到目前为止,我所拥有的代码尚未编译:
unsafe static String AddressOf(Object o)
{
void* p = &o;
return String.Format("{0}", new IntPtr(p));
}
Error: Cannot take the address of, get the size of, or declare a pointer to a managed type ('object')
即使无法检索内存地址,也可能是内存插槽或其他显示该对象的位置的东西。
背景:我的目的是进行一些演示,显示通过值或参考传递并抛弃这些对象的位置之间的差异。
添加了2010-06-27:
我终于放弃了从.NET程序本身中进行此操作的想法。似乎并没有带来任何好的解决方案。即使它工作了,它也会使代码变得混乱,以至于您几乎无法以简单的方式解释结果,并将其用于某些演示目的。我现在想以下面的答案中提出的方式以良好的(含义CLR意识到的)调试器进行。
通过在配置设置中激活选项,可以在VS内改进调试 Enable Unmanaged Debugging
, 不幸的是,在Visual Studio的免费Express Edition(我现在在家中唯一的版本)中没有可用。 有没有办法制作 Enable Unmanaged Debugging
手动工作?
挣扎后,我安装了 Windows的调试工具 这为我提供了windbg。我几年前用于驾驶员开发的好工具。现在,它是一个巨大包装的一部分。我试图按照说明获得sos.dll的工作,而无需成功。我什至找不到这个dll。甚至该解决方案似乎都需要 Enable Unmanaged Debugging
项目中的标志...
解决方案
为了使演示有意义,您需要先固定对象。
GCHandle handle = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();
我会证明使用 SOS (Windows软件包的调试工具的一部分)。您和您的听众实际上会以这种方式获得一些有价值的技能,而不仅仅是努力努力努力CLR实施细节。