.NET:显示对象的存储位置或地址?(.NET: Show the storage location

2019-10-23 16:12发布

有没有办法让“地址”的对象? 这是出于演示的目的, 我知道这是一般一个坏主意 ,如果它在所有工作,然后为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')

即使存储器地址不能retrieven,那么也许内存插槽或别的东西显示出物体的位置。

背景:我的本意是通过值或引用做一些演示展示传球之间的差异和转储这些对象的位置。

ADDED 2010-06-27:

我终于abandonned从.NET程序本身内这样做的想法。 似乎没有引起什么好的解决办法。 即使工作过它会混乱的代码这么多,你可以勉强解释的结果简单的方法,并使用它的一些演示目的。 我现在想用一个好(意为CLR知道),因为在下面的答案劝的方式调试器来做到这一点。

调试可以在里面VS通过激活配置设置的选项加以改进Enable Unmanaged Debugging ,遗憾的是在Visual Studio中的免费版中没有的(我在家里,现在的唯一版本)。 有没有一种方法,使Enable Unmanaged Debugging手动工作?

挣扎了一下后,我安装了Windows调试工具这给我提供了WinDbg的。 伟大的工具,我用几年前的驱动程序的开发。 现在,它是一个巨大的包的一部分。 我试图按照指示获取SOS.DLL方式没有成功的工作。 我甚至无法找到此DLL。 即使这个解决方案似乎需要Enable Unmanaged Debugging项目中的标志......

Answer 1:

为了使演示有意义的,你需要先钉住对象。

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

我将演示使用SOS (for Windows软件包调试工具的一部分)。 你和你的观众居然会获得一些宝贵的技能这种方式,而不是仅仅挥手约CLR实现细节。



文章来源: .NET: Show the storage location or address of an object?