2012-12-04 67 views
0

如果我使用System.Windows.Forms.MessageBox類的show函數繪製消息框,會彈出一個窗口。我想知道繪製這個窗口的實際代碼在哪裏?它在一些Win32 API或user32.dll等?通過反射器,我無法看到Show方法的定義。.NET框架代碼調用何處繪製窗口(本機C++)?

另外,.NET是win32 api的包裝呢?我知道,當我們編譯.net代碼時,它會生成IL,在運行時轉換爲CPU特定指令,然後我們的CPU執行這些指令。但是我有一種感覺,Windows操作系統中有一些常見的代碼負責繪製一個窗口(或從文本文件中讀取等)。所有這些語言如C++,F#,C#,Java等最終都會在框架內調用該代碼。但是,我該如何去尋找並驗證它?

例如:在MFC或Win32中我們調用的一個函數在屏幕上繪製一個窗口,MessageBox.Show也調用相同的函數,但是它的抽象出來了嗎?

然後另一方面我們可以在兩種語言之間進行互操作。

所以我很困惑這裏。此外,我現在通過C#閱讀CLR,因此我的大腦處於超級興奮狀態:-)

+1

爲什麼它在哪裏實施? (它很可能只是調用'MessageBox' API) –

+0

雖然有趣,但這似乎並不是我的主題。您問的是Microsoft如何實現功能,而不是如何編寫任何代碼。 – David

+1

查找併購買Charles Petzold的WinAPI聖經!答案在那裏Neo! – t0mm13b

回答

4

我認爲您處於正確的軌道。無論是語言還是框架,底層都是操作系統,所以一切都會結束,最終:系統調用。

例如,在Windows中打開一個文件系統調用是CreateFile(),不管你用c fopen,C++ ifstream,C#System.IO.*或Java java.io.*

關於您對System.Windows.Forms的問題,他們使用通常的Win32窗口,因此窗口由HWND值標識,在CLR中表示爲IntPtr

關於顯示窗口的功能,您的問題有點令人誤解,因爲涉及到幾個函數,並且Win32 API中有多個圖層。

例如,如果要創建一個窗口,請致電CreateWindowEx(),以便在隱藏調用ShowWindow()時顯示該窗口,並且在窗口過程(需要寫入的回調)收到WM_PAINT消息時將處理畫圖本身。但爲了接收消息,您必須編寫消息泵(GetMessagte()/DispatchMessage())。

但是爲了創建一個簡單的MessageBox(),已經有一個功能可以完成所有這些功能:MessageBox(),其中System.Windows.Forms.MessageBox類是一個直接包裝。

那麼現在是什麼問題呢?啊,是的,我們可以在System.Windows.Forms和Win32之間進行互操作嗎? 是的!

+1

感謝您的回覆羅德里戈。就像你給出了一個CreateFile()的例子一樣,這幾乎適用於所有。net類/函數(不包括System.Math類和其他可以在頂層完成的事情)。最終在某些時候,他們會轉向C++或C代碼並在那裏調用相關的東西。基本上我的目標是儘可能調試(使用windbg/ntsd等)。我也從http://www.microsoft.com/en-nz/download/details.aspx?id=4917安裝了.net符號),以便我可以進入.net代碼。我正在努力不成爲一個普通的開發人員! – VVV

+0

@VVV你怎麼最終與這個順便去? –

+1

@Backwards_Dave - 您可以使用Windows調試器來查看調用堆棧直到內核創建文件。雖然我沒有使用過windbg,但由於我用它來解決其他問題,我知道你也可以使用它。 – VVV