.NET ライブラリ「Vanara」:使いやすいWindows APIラッパーライブラリ

.NET ライブラリ「Vanara」:使いやすいWindows APIラッパーライブラリ

非常にシンプルで使いやすく、Windows APIをうまくラップした.NETライブラリです。面倒なWindows API変換関数をほとんど書く必要がありません。

最終更新 2021/06/28 22:53
沙漠尽头的狼
読了目安 3 分
カテゴリ
.NET
テーマ
C#オープンソースプロジェクト
タグ
.NET C# Windows API

リポジトリ:https://github.com/dahall/Vanara

翻訳:沙漠尽头的浪(レベルに限りがあります。可能であればリポジトリをご参照ください)

非常にシンプルで使いやすく、Windows API を極めてうまくラップした .NET クラスライブラリのシリーズです。面倒な Windows API 変換関数をほとんど書く必要がなくなります。

このプロジェクトは、Windows ライブラリからの P/Invoke 関数、インターフェイス、列挙型、構造体を含むさまざまな .NET アセンブリで構成されています。各アセンブリは、1 つまたはいくつかの密接に関連するライブラリに対応しています。たとえば、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 / Standard プロジェクトに含まれています。

十分なテストの後、このプロジェクトは数週間ごとに新しいバージョンをリリースします。新しいバージョンとリリースノートは Releases セクションにまとめられ、すべての NuGet パッケージは nuget.org に公開されています。GitHub へのプッシュのたびに AppVeyor ビルドがトリガーされます。所有者は無料のオープンソースアカウントに感謝します!記事の先頭にプロジェクトのビルドステータス情報が表示されます。AppVeyor ソース から NuGet パッケージがビルドされます。

使い方

  1. Microsoft ドキュメントで目的の関数を探します。その関数がどのライブラリまたは DLL にあるかを確認します。
  2. 下のサポートされているライブラリの表を確認し、必要な関数(Windows API)を持つ Vanara ライブラリが存在するかを確認します。アセンブリリンクをクリックすると、そのアセンブリのカバレッジの詳細が表示されます。関数が見つかったら、右側にマッチする実装が表示されます。また、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. 一部のケースでは、[サポートアセンブリ] のいずれかに対応するヘルパー / ラッパークラスがあります。特にセキュリティ、システムサービス、フォーム、Shell に関するものです。各ライブラリのページ(セクション内のリンクをクリック)で、含まれているクラスを参照してください。

設計思想

  • 1 つの DLL からインポートされるすべての関数は、その DLL にちなんで名付けられた単一のアセンブリに配置する必要があります。
    • (例:アセンブリ Vanara.PInvoke.Gdi32.dll は、システムディレクトリ内の gdi32.dll からエクスポートされるすべての関数と、それをサポートする列挙型、定数、構造体を保持します。)
  • 多くのライブラリで使用される構造体、マクロ、列挙型(関数以外)は、Vanara.Core または Vanara.PInvoke.Shared ライブラリに配置します。
    • (例:マクロ HIWORD と構造体 SIZEVanara.PInvoke.Shared にあります。相互運用呼び出しの簡素化とネイティブメモリ管理のためのクラスは Vanara.Core にあります。)
  • プロジェクト内では、すべての構造体は、Windows API でそれらが定義されているヘッダーファイル(*.h)にちなんだファイルに含まれます。
    • (例:Vanara.PInvoke.Kernel32 プロジェクトディレクトリには、それぞれ FileApi.h、WinBase.h、WinNT.h に対応する FileApi.cs、WinBase.cs、WinNT.cs があります。)
  • 構造体や関数を直接解釈するとメモリリークや誤用につながる可能性がある場合、その使用を簡略化するように努めています。
  • 構造体が常に参照渡しされ、メモリ割り当てのクリーンアップが必要な場合、構造体を IDisposable を実装するクラスに変更しています。
  • 可能な限り、すべてのハンドルは Windows API ハンドルにちなんだ SafeHandle 派生クラスに変換されています。これらのハンドルが解放 / クローズ / 破棄のために関数呼び出しを必要とする場合、破棄時にその関数を実行する派生 SafeHANDLE が存在します。
    • 例:HTOKEN が定義されています。SafeHTOKEN はそのハンドル上で 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 があります。

サポートされているライブラリ

サポートされているアセンブリ

リンク

サンプルコード

UnitTest フォルダーと、Vanara を使用して Windows サンプルを C# で再現した WinClassicSamplesCS プロジェクトに多くの例があります。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む
同じカテゴリ / 同じタグ 2026/02/07

AOTの使用経験のまとめ

プロジェクト作成当初から、新機能を追加したり新しい構文を使用したりした場合には、すぐにAOT公開テストを実施するという良い習慣を身につけるべきです。

続きを読む