1

有没有办法获取对象的“地址”?这是出于演示目的,我知道这通常是一个坏主意,如果它完全可以作为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 年 6 月 27 日:

我最终放弃了从 .NET 程序本身内部进行操作的想法。似乎不会导致任何好的解决方案。即使它成功了,它也会使代码变得如此混乱,以至于你几乎无法用简单的方式解释结果并将其用于一些演示目的。我现在想按照下面答案中建议的方式使用一个好的(意味着 CLR 感知)调试器来完成它。

调试可以通过激活配置设置中的一个选项在 VS 内部进行改进Enable Unmanaged Debugging,不幸的是在 Visual Studio 的免费快速版(我现在在家中唯一的版本)中不可用。有没有办法Enable Unmanaged Debugging手动进行工作?

经过一番挣扎后,我安装了 Windows 调试工具,它为我提供了 WinDbg。我多年前用于驱动程序开发的好工具。现在它是一个巨大包裹的一部分。我试图按照说明让 SOS.DLL 工作但没有成功。我什至找不到这个 DLL。即使这个解决方案似乎也需要Enable Unmanaged Debugging项目中的标志......

4

1 回答 1

3

为了使演示有意义,您需要先固定对象。

GCHandle handle = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();

我将演示如何使用SOS(Windows 调试工具包的一部分)。您和您的听众实际上将通过这种方式获得一些有价值的技能,而不仅仅是对 CLR 实施细节挥手致意。

于 2010-06-26T15:00:51.503 回答