文章作者:佚名 錄入時間:2006-6-13 來源:不詳
網站聲明:本站的文章除部分特別聲明禁止轉載的專稿外,可以自由轉載.但請務必注明出處和原始作者,文章版權歸本網站與文章作者所有。對於被本站轉載文章的個人和網站,我們表示深深的謝意。
我 在自己最近的編程中注意到一個趨勢,正是這個趨勢才引出本月的專欄主題。最近,我在基於 Microsoft® .NET Framework 的應用程序中完成了大量的 Win32® Interop。我並不是要說我的應用程序充滿了自定義的 interop 代碼,但有時我會在 .Net Framework 類庫中碰到一些次要但又繁絮、不充分的內容,通過調用該 Windows® API,可以快速減少這樣的麻煩。
因此我認為,.NET Framework 1.0 或 1.1 版類庫中存在任何 Windows 所沒有的功能限制都不足為怪。畢竟,32 位的 Windows(不管何種版本)是一個成熟的操作系統,為廣大客戶服務了十多年。相比之下,.Net Framework 卻是一個新事物。
隨著越來越多的開發人員將生產應用程序轉到托管代碼,開發人員更頻繁地研究底層操作系統以圖找出一些關鍵功能顯得很自然 — 至少目前是如此。
值得慶幸的是,公共語言運行庫 (CLR) 的 interop 功能(稱為平台調用 (P/Invoke))非常完善。在本專欄中,我將重點介紹如何實際使用 P/Invoke 來調用 Windows API 函數。當指 CLR 的 COM Interop 功能時,P/Invoke 當作名詞使用;當指該功能的使用時,則將其當作動詞使用。我並不打算直接介紹 COM Interop,因為它比 P/Invoke 具有更好的可訪問性,卻更加復雜,這有點自相矛盾,這使得將 COM Interop 作為專欄主題來討論不太簡明扼要。
走進 P/Invoke
首先從考察一個簡單的 P/Invoke 示例開始。讓我們看一看如何調用 Win32 MessageBeep 函數,它的非托管聲明如以下代碼所示:
BOOL MessageBeep(
UINT uType // beep type
);
為了調用 MessageBeep,您需要在 C# 中將以下代碼添加到一個類或結構定義中:
[DllImport("User32.dll")]
static extern Boolean MessageBeep(UInt32 beepType);
令人驚訝的是,只需要這段代碼就可以使托管代碼調用非托管的 MessageBeep API。它不是一個方法調用,而是一個外部方法定義。(另外,它接近於一個來自 C 而 C# 允許的直接端口,因此以它為起點來介紹一些概念是有幫助的。)來自托管代碼的可能調用如下所示: