知識マップ: C#からネイティブDLLを呼ぶ:C++/CLIラッパー vs P/Invoke
記事「C#からネイティブDLLを呼ぶ:C++/CLIラッパー vs P/Invoke」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、C#からネイティブDLLを呼ぶ際、相手がextern Cのフラットな関数群ならP/Invokeが素直だが、C++のクラス中心のライブラリで所有権・文字列・例外・コールバックが絡む場合はC++/CLIで薄いラッパーを挟むほうが保守しやすいと整理します。P/InvokeはSafeHandleやStructLayoutでネイティブ型を表現しつつ結局C形式のブリッジ層を自作することになりがちですが、C++/CLIはmarshal_asによる型変換やデストラクター・ファイナライザーによるDispose/Finalizeパターン、例外の.NET変換をC++側に閉じ込め、C#には安定したAPIだけを見せられます。一方でC++/CLIはWindows専用かつNative AOTと両立せず、/clrコンパイルとijwhost.dllへの依存を伴うため、クロスプラットフォームや配布制約が厳しい場合は選べません。
flowchart LR
accTitle: C++/CLIラッパーとP/Invokeの使い分けの知識マップ
accDescr: ネイティブDLLの複雑さに応じてP/InvokeとC++/CLIラッパーをどう選び、マーシャリングや所有権・例外・コールバックの扱い、配布制約がそれぞれどう変わるかを示す図です。
cpp_cli["C++/CLI"]
p_invoke["P/Invoke"]
c_api_bridge["C APIブリッジ層"]
c_native_api["フラットなC API"]
cpp_class_native_library["C++のクラス中心のネイティブライブラリ"]
com_marshaling["マーシャリング"]
marshal_as["marshal_as"]
safehandle["SafeHandle"]
structlayout["StructLayout"]
dispose_finalize_pattern["Dispose/Finalizeパターン(C++/CLI)"]
ownership_lifetime_management["所有権・寿命管理"]
exception_translation["例外の.NET変換"]
callback_delegate_lifetime["コールバックのデリゲート寿命管理"]
native_aot["Native AOT"]
ijwhost["ijwhost.dll"]
clr_compilation_flag["/clrコンパイルオプション"]
mixed_assembly["混合アセンブリ"]
cross_platform_requirement["クロスプラットフォーム要件"]
p_invoke -.->|"前提とする"| c_api_bridge
p_invoke -->|"推奨される対応"| c_native_api
cpp_cli -->|"推奨される対応"| cpp_class_native_library
p_invoke -->|"用いるのは非推奨"| cpp_class_native_library
cpp_cli -->|"用いるのは非推奨"| c_native_api
cpp_cli -->|"利用する"| com_marshaling
marshal_as -->|"実装を担う"| com_marshaling
p_invoke -.->|"利用する"| safehandle
p_invoke -.->|"利用する"| structlayout
cpp_cli -->|"実装を担う"| dispose_finalize_pattern
cpp_cli -->|"前提とする"| ownership_lifetime_management
cpp_cli -->|"実装を担う"| exception_translation
cpp_cli -.->|"前提とする"| callback_delegate_lifetime
p_invoke -.->|"前提とする"| callback_delegate_lifetime
cpp_cli -->|"両立しない"| native_aot
cpp_cli -.->|"前提とする"| ijwhost
cpp_cli -->|"で構成できる"| clr_compilation_flag
cpp_cli -->|"実装を担う"| mixed_assembly
c_api_bridge -->|"前提とする"| c_native_api
cpp_cli -.->|"の後継"| c_api_bridge
cpp_cli -->|"両立しない"| cross_platform_requirement
概念間の関係(全21件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- P/InvokeはC APIブリッジ層を前提とします。
- P/InvokeはフラットなC APIに対する本記事の推奨です。
- C++/CLIはC++のクラス中心のネイティブライブラリに対する本記事の推奨です。
- P/InvokeをC++のクラス中心のネイティブライブラリに用いることは推奨されません。
- C++/CLIをフラットなC APIに用いることは推奨されません。
- C++/CLIはマーシャリングを利用します。
- marshal_asはマーシャリングの実装を担います。
- P/InvokeはSafeHandleを利用します。
- P/InvokeはStructLayoutを利用します。
- C++/CLIはDispose/Finalizeパターン(C++/CLI)の実装を担います。
- C++/CLIは所有権・寿命管理を前提とします。
- C++/CLIは例外の.NET変換の実装を担います。
- C++/CLIはコールバックのデリゲート寿命管理を前提とします。
- P/Invokeはコールバックのデリゲート寿命管理を前提とします。
- C++/CLIはNative AOTと両立しません。
- C++/CLIはijwhost.dllを前提とします。
- C++/CLIは/clrコンパイルオプションで構成できます。
- C++/CLIは混合アセンブリの実装を担います。
- C APIブリッジ層はフラットなC APIを前提とします。
- C++/CLIはC APIブリッジ層の後継に当たります。
- C++/CLIはクロスプラットフォーム要件と両立しません。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。