P/Invoke
C#などの.NETコードからアンマネージドなC関数群を呼び出すための、.NETの標準的な相互運用機構。
- 概念URI
https://comcomponent.com/knowledge/p-invoke/
- 別名・表記
- Platform Invoke / P/Invoke(Platform Invoke) / DllImport
- 最終確認日
- 2026-08-01
- 機械可読データ
- JSON-LD
この概念が関わる関係
- P/InvokeはC APIブリッジ層を前提とします。P/InvokeはDLLのエクスポート関数しか直接呼べないため、C++のクラスを相手にする場合は結局どこかでC形式の関数に落とすブリッジ層が必要になる(相手が最初からフラットなC APIならブリッジ層は不要) / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/InvokeはフラットなC APIに対する本記事の推奨です。相手がextern "C"で公開されたフラットなC関数群になっているなら、P/Invokeが素直で一番簡単である / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- P/InvokeをC++のクラス中心のネイティブライブラリに用いることは推奨されません。P/Invokeで直接呼べるのはDLLのエクスポート関数だけなので、C++のクラス中心のライブラリを相手にすると実質的にC互換API設計を自分で始めることになる / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- P/InvokeはSafeHandleを利用します。P/InvokeでネイティブハンドルをC#側から扱う場合、IntPtrを裸で持ち回る代わりにSafeHandleを派生させ、ReleaseHandleから解放関数を呼ぶ / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/InvokeはStructLayoutを利用します。P/Invokeで構造体をネイティブ側に合わせるには、StructLayout属性でLayoutKind.Sequentialなどのメモリ配置を指定する / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/Invokeはコールバックのデリゲート寿命管理を前提とします。P/Invokeでコールバックを扱う場合、デリゲートがGCに回収されないようフィールドなどで参照を保持し続ける必要がある / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/InvokeはC#からCの関数群を呼ぶ要件に対する本記事の推奨です。C#からCの関数群を呼ぶ場合は、向きが素直なP/Invokeが自然な選択肢になる。 / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- SafeHandleはP/Invokeに対する本記事の推奨です。ネイティブハンドルを生のIntPtrではなくSafeHandle派生クラスで持つことが、P/Invokeにおける.NETの基本作法として推奨される / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- P/Invokeはハンドルのリサイクル攻撃の原因になることがあります。ハンドルを生のIntPtrで持つと、Windowsが積極的に再利用するハンドル値を介して無関係なリソースを操作してしまう事故が起こり得る / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/InvokeはMarshal.GetLastPInvokeErrorを利用します。SetLastError=trueを明示的に付けたP/Invoke呼び出しでは、その失敗直後にMarshal.GetLastPInvokeErrorでWin32エラーコードを取得する / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/InvokeはStructLayoutAttribute.Packを利用します。構造体をP/Invokeでやり取りする場合に限り、StructLayoutAttributeでレイアウトを制御し、既定のPack=0が示すプラットフォーム既定パッキングサイズを意識する / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/Invokeはblittable型を利用します。マネージドとアンマネージドでビット表現が同じブリッタブル型は変換なしにそのまま渡せ、P/Invokeで高速に扱える / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- P/Invokeは関数ポインターのデリゲートがGCに回収されるクラッシュの原因になることがあります。Marshal.GetFunctionPointerForDelegateで取得した関数ポインターとデリゲートの関連をGCは追跡しないため、寿命管理を怠るとクラッシュにつながる / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- P/Invokeはbitness一致要件を前提とします。P/InvokeでDLLを呼び出すプロセスと対象DLLのビット構成(32bit/64bit)は一致している必要があり、異なるビット数のDLLは同一プロセスに共存できない / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- Add-TypeはP/Invokeの実装を担います。Add-TypeにDllImport付きのC#シグネチャを渡すと、その場でコンパイルされてP/Invoke経由でWin32 APIを呼び出せるようになる / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- P/InvokeはP/Invokeシグネチャ誤りによるクラッシュの原因になることがあります。DllImportのシグネチャ(引数の型、文字セット、呼び出し規約)を誤ると、例外では済まずプロセスごと落ちることがある / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
この概念を扱う記事
一次資料
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。