2010-09-19 35 views
0

我正在学习.NET/C#,因为我几乎总是想知道如何管理对象在实际内存中的表示,我想知道是否有任何编程方法来获取这些信息,包括对象的内存地址,字节大小,内存布局等等?我可以检索.Net(C#)管理对象的物理/非托管信息

我知道.NET不鼓励它,隐藏信息作为内部实现细节。但我真的很好奇它的调试和学习的目的。

+0

如果你逐步浏览应用程序的反汇编版本,使用C#字节代码,那么你可以看到发生了什么,但要获得更多信息,你会需要降低级别,C#不会让你看起来太低级别,那么C++就成为你唯一的选择。 – 2010-09-19 23:13:18

回答

3

有所产生的C#编译器的代码2个编译版本:

  • 首先,它被编译成普通中介语言(CIL)。您可以通过在Visual Studio命令提示符中使用ildasm命令或通过使用(更好)的工具(如Redgate's .NET Reflector
  • )来查看此内容。然后将它从CIL编译为本地机器代码(由Just In Time Compiler执行)并运行。您可以在Visual Studio中使用Debug > Windows > Disassembly来查看此代码。

但您对本机类型的内存表示感兴趣。这可能很难并且很难理解,但是如果您觉得自己能够胜任,可以使用WinDbgSOS.dll以本机方式调试托管代码。我会看看this list of links让你开始。只需谷歌“SOS.dll”了解更多信息。

我不认为你可以(很容易)通过编程方式完成CLR。也许(很可能)如果你使用NGEN来提前编译你的程序集,那么你可以使用一些狡猾的C或C++来做到这一点,但它会是极其难难(这是超出我的知识区,在JIT团队工作的人可能会帮助你)

+0

感谢您的信息。它似乎没有直接的方式在C#本身。我会放弃。我可以在反汇编中查看原始内存内容,但无法从CIL查看托管内存内容。但不管怎么说... – Sheen 2010-09-20 08:20:45