リポジトリ: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 パッケージがビルドされます。
使い方
- Microsoft ドキュメントで目的の関数を探します。その関数がどのライブラリまたは DLL にあるかを確認します。
- 下のサポートされているライブラリの表を確認し、必要な関数(Windows API)を持つ Vanara ライブラリが存在するかを確認します。アセンブリリンクをクリックすると、そのアセンブリのカバレッジの詳細が表示されます。関数が見つかったら、右側にマッチする実装が表示されます。また、GitHub のプロジェクト検索(ページ左上)を使用して、関数、メソッド、定数を検索することもできます。「このリポジトリ内」を選択してください。
- NuGet からプロジェクトにアセンブリを追加します。
- 関数を使用するには、次の方法があります:
-
- 直接呼び出す:
var bret = Vanara.PInvoke.Kernel32.GetComputerName(sb, ref sbSz);
- 直接呼び出す:
-
- C# 6.0 以降では、
static usingディレクティブを使用して呼び出す:
using static Vanara.PInvoke.Kernel32; var bret = GetComputerName(sb, ref sbSz); - C# 6.0 以降では、
-
- 一部のケースでは、[サポートアセンブリ] のいずれかに対応するヘルパー / ラッパークラスがあります。特にセキュリティ、システムサービス、フォーム、Shell に関するものです。各ライブラリのページ(セクション内のリンクをクリック)で、含まれているクラスを参照してください。
設計思想
- 1 つの DLL からインポートされるすべての関数は、その DLL にちなんで名付けられた単一のアセンブリに配置する必要があります。
- (例:アセンブリ
Vanara.PInvoke.Gdi32.dllは、システムディレクトリ内のgdi32.dllからエクスポートされるすべての関数と、それをサポートする列挙型、定数、構造体を保持します。)
- (例:アセンブリ
- 多くのライブラリで使用される構造体、マクロ、列挙型(関数以外)は、
Vanara.CoreまたはVanara.PInvoke.Sharedライブラリに配置します。- (例:マクロ
HIWORDと構造体SIZEはVanara.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);
- Windows API:
- PInvoke 呼び出しを使用するクラスや拡張がある場合、それらは
Vanaraをプレフィックスとするラッパーアセンブリに配置され、その後ろに機能の論理名が続きます。現時点では、Core、Security、SystemServices、Windows.Forms、Windows.Shell があります。
サポートされているライブラリ





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

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