有没有办法获得对象的“地址”?这是出于演示目的 我知道这是一个坏主意 通常,如果它完全有效,那么 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实施细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top