知識マップ: 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が選択肢になります。
flowchart LR
accTitle: P/InvokeでWin32 APIを安全に呼ぶ知識マップ
accDescr: LibraryImportがコンパイル時マーシャリング生成によりDllImportのILスタブに代わってNative AOTとトリミングに対応すること、CsWin32が既定でDllImportベースのシグネチャを自動生成しSafeHandle型を出力すること、SafeHandleがハンドルのリサイクル攻撃を防ぐこと、GetLastPInvokeErrorやStructLayout.Pack・StringMarshalling・ブリッタブル型・コールバックデリゲートの寿命管理が実務の要点であること、異なるビット数のDLLをまたぐ要件にはCOMが選択肢になることを示す図
p_invoke["P/Invoke"]
libraryimport["LibraryImport"]
dllimport["DllImport"]
il_stub["ILスタブ"]
native_aot["Native AOT"]
trimming["trimming(トリミング)"]
cswin32["CsWin32"]
safehandle["SafeHandle"]
handle_recycling_attack["ハンドルのリサイクル攻撃"]
stringmarshalling["StringMarshalling"]
getlastpinvokeerror["Marshal.GetLastPInvokeError"]
structlayout_pack["StructLayoutAttribute.Pack"]
blittable_type["blittable型"]
delegate_callback_lifetime_management["コールバックデリゲートの寿命管理"]
callback_pointer_gc_crash["関数ポインターのデリゲートがGCに回収されるクラッシュ"]
unmanagedcallersonly["UnmanagedCallersOnly属性"]
bitness_match_requirement["bitness一致要件"]
com["COM(コンポーネントオブジェクトモデル)"]
libraryimport -->|"の後継"| dllimport
dllimport -->|"利用する"| il_stub
il_stub -->|"用いるのは非推奨"| native_aot
libraryimport -->|"推奨される対応"| native_aot
libraryimport -->|"推奨される対応"| trimming
il_stub -->|"用いるのは非推奨"| trimming
cswin32 -.->|"自動化する"| dllimport
cswin32 -.->|"推奨される対応"| native_aot
cswin32 -->|"利用する"| safehandle
safehandle -->|"推奨される対応"| p_invoke
safehandle -->|"防止する"| handle_recycling_attack
p_invoke -.->|"原因になり得る"| handle_recycling_attack
libraryimport -->|"利用する"| stringmarshalling
p_invoke -.->|"利用する"| getlastpinvokeerror
p_invoke -.->|"利用する"| structlayout_pack
p_invoke -->|"利用する"| blittable_type
delegate_callback_lifetime_management -->|"防止する"| callback_pointer_gc_crash
p_invoke -.->|"原因になり得る"| callback_pointer_gc_crash
unmanagedcallersonly -->|"推奨される対応"| callback_pointer_gc_crash
p_invoke -->|"前提とする"| bitness_match_requirement
com -->|"推奨される対応"| bitness_match_requirement
概念間の関係(全21件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- LibraryImportはDllImportの後継に当たります。
- DllImportはILスタブを利用します。
- ILスタブをNative AOTに用いることは推奨されません。
- LibraryImportはNative AOTに対する本記事の推奨です。
- LibraryImportはtrimming(トリミング)に対する本記事の推奨です。
- ILスタブをtrimming(トリミング)に用いることは推奨されません。
- CsWin32はDllImportを自動化します。
- CsWin32はNative AOTに対する本記事の推奨です。
- CsWin32はSafeHandleを利用します。
- SafeHandleはP/Invokeに対する本記事の推奨です。
- SafeHandleはハンドルのリサイクル攻撃を防ぎます。
- P/Invokeはハンドルのリサイクル攻撃の原因になることがあります。
- LibraryImportはStringMarshallingを利用します。
- P/InvokeはMarshal.GetLastPInvokeErrorを利用します。
- P/InvokeはStructLayoutAttribute.Packを利用します。
- P/Invokeはblittable型を利用します。
- コールバックデリゲートの寿命管理は関数ポインターのデリゲートがGCに回収されるクラッシュを防ぎます。
- P/Invokeは関数ポインターのデリゲートがGCに回収されるクラッシュの原因になることがあります。
- UnmanagedCallersOnly属性は関数ポインターのデリゲートがGCに回収されるクラッシュに対する本記事の推奨です。
- P/Invokeはbitness一致要件を前提とします。
- COM(コンポーネントオブジェクトモデル)はbitness一致要件に対する本記事の推奨です。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。