知識マップ: 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への依存を伴うため、クロスプラットフォームや配布制約が厳しい場合は選べません。

C++/CLIラッパーとP/Invokeの使い分けの知識マップネイティブDLLの複雑さに応じてP/InvokeとC++/CLIラッパーをどう選び、マーシャリングや所有権・例外・コールバックの扱い、配布制約がそれぞれどう変わるかを示す図です。前提とする推奨される対応推奨される対応用いるのは非推奨用いるのは非推奨利用する実装を担う利用する利用する実装を担う前提とする実装を担う前提とする前提とする両立しない前提とするで構成できる実装を担う前提とするの後継両立しないC++/CLIP/InvokeC APIブリッジ層フラットなC APIC++のクラス中心のネイティブライブラリマーシャリングmarshal_asSafeHandleStructLayoutDispose/Finalizeパターン(C++/CLI)所有権・寿命管理例外の.NET変換コールバックのデリゲート寿命管理Native AOTijwhost.dll/clrコンパイルオプション混合アセンブリクロスプラットフォーム要件

概念間の関係(全21件)

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

主要概念の定義

C++/CLI
ネイティブC++とマネージド.NETの両方を1つのプロジェクトで扱えるMicrosoftの言語拡張。ネイティブDLLとC#の間に薄いラッパー層を作るのに使われる。
P/Invoke
C#などの.NETコードからアンマネージドなC関数群を呼び出すための、.NETの標準的な相互運用機構。
marshal_as
C++/CLIが提供する変換ヘルパー。marshal_as<std::wstring>(managedString)のように、msclr/marshal_cppstd.hなどを取り込んで.NETの型とネイティブの型を相互に変換する。
C APIブリッジ層
C++のクラスをP/Invokeから呼べるようにするために間に挟む、C形式のエクスポート関数群。

機械可読データ

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