是否有可用於 .NET 的完整 user32.dll 包裝庫?
目前我正在通過 VB.NET 對 user32.dll 進行大量互操作。由於 user32.dll 不在 .NET 級別,而是在本機級別,我需要使用 Declare 語句聲明函式。雖然這很好用,但我一遍又一遍地聲明它們。
我在Google上搜尋,但我遇到的唯一有用的網站是pinvoke.net。雖然它確實在一定程度上包含了資訊,但有相當多的功能要麼沒有描述,要麼在它的文件中有很多“TODO”部分。
因此,我想知道是否有可用於 .NET 的 user32.dll 的完整包裝器。恐怕我找不到任何東西,但也許我看的不正確。
.NET Framework 的 user32.dll的*完整包裝器將毫無意義。*user32.dll 導出的絕大多數函式都有對應的函式,這些函式都是由 .NET Framework 原生實現的。事實上,整個 .NET Framework 只是 Windows API 的一個包裝器,包括 user32.dll。
我建議您不要嘗試使用 user32.dll 中的 P/Invoke 函式,因為有一種方法可以使用 .NET Framework 已經提供的功能通過託管程式碼執行此操作。在嘗試自己重新發明輪子之前,請先查看 MSDN 或您選擇的方便的 .NET 參考指南。
如果並且當您確定您需要的特定函式沒有本機等效函式時,那麼並且只有在那時您才應該考慮 P/Invoking Windows API。在這種情況下,由於您已經大大縮小了必須導入的函式的數量,因此使用 MSDN 文件pinvoke.net的組合來確定函式簽名應該只是最少量的工作和堆棧溢出。我想說自己編寫此程式碼的好處(現在您已將所需內容縮減到更易於管理的大小)是您實際上需要閱讀文件並準確了解其工作原理。如果您依賴其他人編寫的程式碼,則無法保證其編寫正確、遵循最佳實踐、實現任何錯誤處理,甚至無法保證您了解它的工作原理和使用方法。
最後,我建議即使在 VB.NET 中,您也對 P/Invoking 函式使用標準 C# 語法,而不是
Declare. 例如:<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ Private Shared Function AppendMenu(ByVal hMenu As IntPtr, ByVal uFlags As MenuFlags, ByVal uIDNewItem As Int32, ByVal lpNewItem As String) As Boolean End Function我認為這是更可取的原因有幾個:
- 該
Declare語法試圖保持與 VB 6 處理方式的向後兼容性。官方的 .NET 方式(在 C# 中常用)是使用<DllImport>屬性,並且由於您正在編寫針對 .NET Framework 的全新程式碼,因此您應該強烈考慮使用官方語法。這裡的另一個好處是使用 C# 的人會更熟悉您的程式碼,並且他們將更有能力幫助您進行聲明。您在網上找到的範例最有可能以這種方式編寫,而不是使用傳統的 VB 6 樣式語法。- 有時,
Declare語法有一些意想不到的行為。例如,某些類型的編組方式與標準<DllImport>語法不同。對於更熟悉標準 .NET 行為的人來說,這可能會讓人很困惑。另請參閱解決類似問題的這個問題。