2010-09-19 48 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