net類庫“vanara”:簡單易用的windows api封裝庫

net類庫“vanara”:簡單易用的windows api封裝庫

一系列非常簡單易用,對windows api做了極好封裝的.net類庫,幾乎不用再寫繁瑣的windows api轉換函數了。

最后更新 2021/6/28 下午10:53
沙漠尽头的狼
预计阅读 5 分钟
分类
.NET
专题
c#開源項目
标签
.NET C# Windows API

倉庫地址:https://github.com/dahall/Vanara

翻譯:沙漠盡頭的浪(水平有限,如有條件請儘量查看倉庫地址翻閱)

一系列非常簡單易用,對 windows api 做了極好封裝的.net 類庫,幾乎不用再寫繁瑣的 windows api 轉換函數了。

此項目包含各種.net 程式集,這些程式集包含來自 windows 庫的 p/invoke 函數、接口、枚舉和結構。每個程式集都與一個或幾個緊密相關的庫相關聯。例如,shlwapi.dll 包含從 shlwapi.lib 導出的所有函數;kernel32.dll 包含 kernel32.lib 和 kernelbase.lib 的全部。

所有程序集都可通过 NuGet 获得,并提供针对.NET 2.0、3.5、4.0、4.5、Core 3.0、Core 3.1 和.NET 5.0(v3.2.20 中新增)的版本,并支持SourceLink。在依赖项不允许的所有情况下,.NET Standard 2.0、.NET Core 2.0 和 2.1 版本也包含在 UWP 和其他.NET Core 及标准项目中。

在充分测试之后,这个项目每隔几周发布一次新版本。新的版本和发行说明一起被编目在Releases部分,所有 NuGet 包都发布到nuget.org。每个 GitHub 推送都会触发AppVeyor构建。所有者感谢他们的免费开源账户!文章开头显示了项目构建状态信息。AppVeyor 源用于构建 NuGet 包。

怎麼用?

  1. 在 microsoft 文檔中查找所需的函數。請注意函數位於哪個庫或 dll 中。
  2. 查看下面的支持庫表,確認 vanara 庫存在並具有您需要的函數(windows api)。單擊程式集連結將帶您深入了解該程式集的覆蓋範圍。找到你的函數,如果有一個匹配的實現,它會出現在右邊。您還可以使用 github 的項目搜索(頁面左上角)來搜索函數、方法或常量。確保選擇“在此存儲庫中”。
  3. 通過 nuget 將程式集添加到項目中。
  4. 要使用該功能,您可以:
    1. 直接调用var bret = Vanara.PInvoke.Kernel32.GetComputerName(sb, ref sbSz);
    1. 在 c#6.0 及更高版本下,使用 static using 指令並調用它:
using static Vanara.PInvoke.Kernel32;

var bret = GetComputerName(sb, ref sbSz);

5.在某些情況下,其中一個[支持程式集]中有一個對應的 helper/wrapper 類,特別是對於安全性、系統服務、窗體和 shell。轉到他們的庫頁面(單擊部分中的連結),瀏覽每個庫中包含的類。

設計理念

  • 從單個 dll 導入的所有函數都應放置到以 dll 命名的單個程式集中。
    • (例如,程序集Vanara.PInvoke.Gdi32.dll承载系统目录中从gdi32.dll导出的所有函数和支持的枚举、常量和结构。)
  • 任何由许多库使用的结构、宏或枚举(非函数)都会放入Vanara.Core或'Vanara.PInvoke.Shared`库中。
    • (例如,宏HIWORD'和结构SIZE都在Vanara.PInvoke.Shared中,简化互操作调用和本机内存管理的类都在'Vanara.Core中)
  • 在項目中,所有構造都包含在一個以頭文件(*.h)命名的文件中,其中這些結構在 windows api 中定義。
    • (例如,在Vanara.PInvoke.Kernel32项目目录中,您将分别找到一个 FileApi.cs、WinBase.cs 和一个 WinNT.cs 文件,分别表示 FileApi.h、WinBase.h 和 WinNT.h)
  • 如果直接解釋結構或函數會導致內存泄漏或誤用,我試圖簡化它的使用。
  • 在结构体总是通过引用传递,并且在需要清理内存分配的地方,我将结构体更改为实现IDispoable的类。
  • 尽可能,所有句柄都已转换为以 Windows API 句柄命名的SafeHandle派生工具。如果这些句柄需要调用函数以释放/关闭/销毁,则存在一个派生的SafeHANDLE,该函数将在 disposal 时执行该函数。
    • 例如,定义了HTOKENSafeHTOKEN在该句柄上调用CloseHandle自动释放。
  • 儘可能,分配調用方釋放的內存的所有函數都使用安全的內存句柄。
  • 程序集中所有 PInvoke 调用都以'Vanara.PInvoke`为前缀。
  • 如果要将结构体作为常量传递到函数中,则使用in语句封装该结构体,该语句将通过引用传递结构体,而不需要ref关键字。
    • Windows API:BOOL MapDialogRect(HWND hDlg, LPRECT LPRECT)
    • Vanara:bool MapDialogRect(HWND hDlg, in RECT lpRect);
  • 如果有類或擴展使用 pinvoke 調用,則它們位於以'vanara'前綴的包裝程式集中,然後後跟該功能的邏輯名稱。今天,它們是 core、security、systemservices、windows.forms 和 windows.shell。

支持的庫

支持的程式集

連結

示例代碼

There are numerous examples in the UnitTest folder and in the WinClassicSamplesCS project that recreates the Windows Samples in C# using Vanara.

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/2/7

aot使用經驗總結

從項目創建伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 aot 發布測試。

继续阅读