知識マップ: C#からWin32 APIを安全に呼ぶ ── P/Invoke実務ガイド(DllImport / LibraryImport / CsWin32)

記事「C#からWin32 APIを安全に呼ぶ ── P/Invoke実務ガイド(DllImport / LibraryImport / CsWin32)」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事はC#からWin32 APIをP/Invokeで安全に呼ぶための実務ポイントを、LibraryImportを軸に整理します。DllImportが実行時にILスタブを生成するのに対し、LibraryImportはコンパイル時にマーシャリングコードを生成するためNative AOTやトリミングに対応します。CsWin32は既定ではDllImportベースでシグネチャを自動生成し、HANDLEを適切なSafeHandle派生型として出力します。SafeHandleはハンドルの早期解放やリサイクル攻撃を防ぐ一方、生のIntPtrで保持するとこの事故が起こり得ます。文字列はStringMarshallingを明示し、構造体はStructLayout.Packの既定値がプラットフォームで異なる点を意識し、ブリッタブル型はそのまま高速に渡せます。コールバックはデリゲートの寿命をstatic保持かGC.KeepAliveで管理するか、UnmanagedCallersOnlyに置き換えます。異なるビット数のDLLをまたぐ要件はP/Invokeでは解決できず、COMが選択肢になります。

P/InvokeでWin32 APIを安全に呼ぶ知識マップLibraryImportがコンパイル時マーシャリング生成によりDllImportのILスタブに代わってNative AOTとトリミングに対応すること、CsWin32が既定でDllImportベースのシグネチャを自動生成しSafeHandle型を出力すること、SafeHandleがハンドルのリサイクル攻撃を防ぐこと、GetLastPInvokeErrorやStructLayout.Pack・StringMarshalling・ブリッタブル型・コールバックデリゲートの寿命管理が実務の要点であること、異なるビット数のDLLをまたぐ要件にはCOMが選択肢になることを示す図の後継利用する用いるのは非推奨推奨される対応推奨される対応用いるのは非推奨自動化する推奨される対応利用する推奨される対応防止する原因になり得る利用する利用する利用する利用する防止する原因になり得る推奨される対応前提とする推奨される対応P/InvokeLibraryImportDllImportILスタブNative AOTtrimming(トリミング)CsWin32SafeHandleハンドルのリサイクル攻撃StringMarshallingMarshal.GetLastPInvokeErrorStructLayoutAttribute.Packblittable型コールバックデリゲートの寿命管理関数ポインターのデリゲートがGCに回収されるクラッシュUnmanagedCallersOnly属性bitness一致要件COM(コンポーネントオブジェクトモデル)

概念間の関係(全21件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

P/Invoke
C#などの.NETコードからアンマネージドなC関数群を呼び出すための、.NETの標準的な相互運用機構。
LibraryImport
.NET 7で追加された、partialメソッドに対しコンパイル時にP/Invokeのマーシャリングコードを生成するソースジェネレーター。
DllImport
P/Invoke宣言に対して実行時にランタイムがマーシャリング用のILスタブを生成する、従来からの属性ベースの仕組み。
ILスタブ
DllImportの呼び出しに対してランタイムが実行時に生成する、マーシャリング処理を含む中間コード。
CsWin32
公式のWin32メタデータから、呼びたい関数のP/Invokeシグネチャ・定数・構造体を自動生成するソースジェネレーター。
SafeHandle
ネイティブのハンドルを包む.NETの抽象クラス。IntPtrを裸で持ち回る代わりに使い、ハンドルの解放漏れと使用中の解放事故を防ぐ。
コールバックデリゲートの寿命管理
ネイティブ側に渡した関数ポインターに対応するデリゲートを、staticフィールドでの保持やGC.KeepAliveでGCに回収されないよう管理すること。
UnmanagedCallersOnly属性
static メソッドに付与すると、そのメソッドをネイティブコードから直接呼び出せるCのエントリポイントとして公開できる.NETの属性。
COM(コンポーネントオブジェクトモデル)
公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。