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