@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/07/000-cpp-cli-wrapper-for-native-dlls/#article>
    schema:about <https://comcomponent.com/knowledge/cpp-cli/>, <https://comcomponent.com/knowledge/p-invoke/> ;
    schema:mentions <https://comcomponent.com/knowledge/c-native-api/>, <https://comcomponent.com/knowledge/cpp-class-native-library/>, <https://comcomponent.com/knowledge/c-api-bridge/>, <https://comcomponent.com/knowledge/com-marshaling/>, <https://comcomponent.com/knowledge/marshal-as/>, <https://comcomponent.com/knowledge/safehandle/>, <https://comcomponent.com/knowledge/structlayout/>, <https://comcomponent.com/knowledge/dispose-finalize-pattern/>, <https://comcomponent.com/knowledge/ownership-lifetime-management/>, <https://comcomponent.com/knowledge/exception-translation/>, <https://comcomponent.com/knowledge/callback-delegate-lifetime/>, <https://comcomponent.com/knowledge/native-aot/>, <https://comcomponent.com/knowledge/ijwhost/>, <https://comcomponent.com/knowledge/clr-compilation-flag/>, <https://comcomponent.com/knowledge/mixed-assembly/>, <https://comcomponent.com/knowledge/cross-platform-requirement/> .

<https://comcomponent.com/knowledge/cpp-cli/> a skos:Concept ;
    skos:prefLabel "C++/CLI"@ja ;
    skos:definition "ネイティブC++とマネージド.NETの両方を1つのプロジェクトで扱えるMicrosoftの言語拡張。ネイティブDLLとC#の間に薄いラッパー層を作るのに使われる。"@ja ;
    skos:altLabel "C++/CLIラッパー"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/cpp-class-native-library/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/c-native-api/> ;
    ks:uses <https://comcomponent.com/knowledge/com-marshaling/> ;
    ks:implements <https://comcomponent.com/knowledge/dispose-finalize-pattern/> ;
    ks:requires <https://comcomponent.com/knowledge/ownership-lifetime-management/> ;
    ks:implements <https://comcomponent.com/knowledge/exception-translation/> ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/native-aot/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/clr-compilation-flag/> ;
    ks:implements <https://comcomponent.com/knowledge/mixed-assembly/> ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/cross-platform-requirement/> .

<https://comcomponent.com/knowledge/p-invoke/> a skos:Concept ;
    skos:prefLabel "P/Invoke"@ja ;
    skos:definition "C#などの.NETコードからアンマネージドなC関数群を呼び出すための、.NETの標準的な相互運用機構。"@ja ;
    skos:altLabel "Platform Invoke" ;
    skos:altLabel "P/Invoke(Platform Invoke)" ;
    skos:altLabel "DllImport" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/c-native-api/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/cpp-class-native-library/> .

<https://comcomponent.com/knowledge/c-api-bridge/> a skos:Concept ;
    skos:prefLabel "C APIブリッジ層"@ja ;
    skos:definition "C++のクラスをP/Invokeから呼べるようにするために間に挟む、C形式のエクスポート関数群。"@ja ;
    skos:altLabel "Cブリッジ関数"@ja ;
    ks:requires <https://comcomponent.com/knowledge/c-native-api/> .

<https://comcomponent.com/knowledge/c-native-api/> a skos:Concept ;
    skos:prefLabel "フラットなC API"@ja ;
    skos:definition "extern \"C\"で公開された、クラスを持たないフラットな関数群としてのネイティブAPI。呼び出し規約や名前修飾の取り決めが単純で安定している。"@ja ;
    skos:altLabel "extern \"C\" 関数群"@ja .

<https://comcomponent.com/knowledge/cpp-class-native-library/> a skos:Concept ;
    skos:prefLabel "C++のクラス中心のネイティブライブラリ"@ja ;
    skos:definition "クラス・所有権・例外・std::wstringやstd::vectorといったC++固有の型やコールバックを中心に設計されたネイティブDLL。"@ja ;
    skos:altLabel "C++クラスライブラリ"@ja .

<https://comcomponent.com/knowledge/com-marshaling/> a skos:Concept ;
    skos:prefLabel "マーシャリング"@ja ;
    skos:definition "プロセス境界だけでなく、同一プロセス内のCOMアパートメント境界やマネージド/ネイティブ境界のような呼び出し境界を越えて、引数や戻り値をやり取りできる形に詰め直すこと。"@ja ;
    skos:altLabel "marshaling" ;
    skos:altLabel "Marshaling" ;
    skos:altLabel "Marshalling" .

<https://comcomponent.com/knowledge/marshal-as/> a skos:Concept ;
    skos:prefLabel "marshal_as"@ja ;
    skos:definition "C++/CLIが提供する変換ヘルパー。marshal_as<std::wstring>(managedString)のように、msclr/marshal_cppstd.hなどを取り込んで.NETの型とネイティブの型を相互に変換する。"@ja ;
    skos:altLabel "msclr::interop::marshal_as" ;
    ks:implements <https://comcomponent.com/knowledge/com-marshaling/> .

<https://comcomponent.com/knowledge/safehandle/> a skos:Concept ;
    skos:prefLabel "SafeHandle"@ja ;
    skos:definition "ネイティブのハンドルを包む.NETの抽象クラス。IntPtrを裸で持ち回る代わりに使い、ハンドルの解放漏れと使用中の解放事故を防ぐ。"@ja .

<https://comcomponent.com/knowledge/structlayout/> a skos:Concept ;
    skos:prefLabel "StructLayout"@ja ;
    skos:definition "C#の構造体のメモリ配置をネイティブ側に合わせるための属性。LayoutKind.Sequentialで宣言順どおりに並べる、CharSetで文字列の扱いを指定するといった用途で使う。"@ja ;
    skos:altLabel "LayoutKind.Sequential" .

<https://comcomponent.com/knowledge/dispose-finalize-pattern/> a skos:Concept ;
    skos:prefLabel "Dispose/Finalizeパターン(C++/CLI)"@ja ;
    skos:definition "C++/CLIのデストラクター(~T())とファイナライザー(!T())が、コンパイラーによってそれぞれIDisposable.Dispose()とObject.Finalizeに変換される仕組み。"@ja ;
    skos:altLabel "~T()と!T()"@ja .

<https://comcomponent.com/knowledge/ownership-lifetime-management/> a skos:Concept ;
    skos:prefLabel "所有権・寿命管理"@ja ;
    skos:definition "呼び出し側が解放するのか、返されたポインタは借り物なのか、内部でキャッシュしていて寿命に前提があるのかといった、ネイティブオブジェクトの所有権と寿命の設計。"@ja ;
    skos:altLabel "ownership" ;
    skos:altLabel "寿命の前提"@ja .

<https://comcomponent.com/knowledge/exception-translation/> a skos:Concept ;
    skos:prefLabel "例外の.NET変換"@ja ;
    skos:definition "下位層の実装都合(ネイティブ側のC++例外・エラーコードや、HttpRequestException・DBドライバ固有の例外など)を、境界のtry/catchによってその層にとって意味のある例外・失敗へ変換すること。"@ja ;
    skos:altLabel "例外変換"@ja .

<https://comcomponent.com/knowledge/callback-delegate-lifetime/> a skos:Concept ;
    skos:prefLabel "コールバックのデリゲート寿命管理"@ja ;
    skos:definition "ネイティブ側からのコールバックをC#のデリゲートで受けるとき、デリゲートがGCに回収されないよう寿命を管理する必要があること。"@ja ;
    skos:altLabel "デリゲート寿命"@ja .

<https://comcomponent.com/knowledge/native-aot/> a skos:Concept ;
    skos:prefLabel "Native AOT"@ja ;
    skos:definition ".NETアプリを単一のネイティブバイナリへ事前コンパイルする発行方式。非対応リストにC++/CLIが明記されている。"@ja ;
    skos:altLabel "PublishAot" .

<https://comcomponent.com/knowledge/ijwhost/> a skos:Concept ;
    skos:prefLabel "ijwhost.dll"@ja ;
    skos:definition ".NET(Core系)をターゲットにするC++/CLIの出力に配置する必要がある、IJW(It Just Works)ホストのランタイムコンポーネント。"@ja .

<https://comcomponent.com/knowledge/clr-compilation-flag/> a skos:Concept ;
    skos:prefLabel "/clrコンパイルオプション"@ja ;
    skos:definition "プロジェクトを共通言語ランタイム(CLR)向けにコンパイルするMSVCのオプション。指定すると/MDも有効になり、MSVCランタイムのDLLが必要になる。"@ja ;
    skos:altLabel "/clr" .

<https://comcomponent.com/knowledge/mixed-assembly/> a skos:Concept ;
    skos:prefLabel "混合アセンブリ"@ja ;
    skos:definition "ネイティブの機械語命令とMSILの両方を含むDLL。C++/CLIラッパーはこの形式になる。"@ja ;
    skos:altLabel "Mixed Assembly" .

<https://comcomponent.com/knowledge/cross-platform-requirement/> a skos:Concept ;
    skos:prefLabel "クロスプラットフォーム要件"@ja ;
    skos:definition "Windows以外のOS(Linux、macOSなど)でも動作させる必要があるという開発要件。"@ja ;
    skos:altLabel "クロスプラットフォーム対応"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/c-api-bridge/> ;
    schema:description "P/InvokeはDLLのエクスポート関数しか直接呼べないため、C++のクラスを相手にする場合は結局どこかでC形式の関数に落とすブリッジ層が必要になる(相手が最初からフラットなC APIならブリッジ層は不要)"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/c-native-api/> ;
    schema:description "相手がextern \"C\"で公開されたフラットなC関数群になっているなら、P/Invokeが素直で一番簡単である"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/cpp-class-native-library/> ;
    schema:description "相手がC++のクラス中心のライブラリで、所有権・文字列・配列・例外・コールバックが絡むなら、C++/CLIで薄いラッパーを1枚挟むほうが保守しやすい"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/cpp-class-native-library/> ;
    schema:description "P/Invokeで直接呼べるのはDLLのエクスポート関数だけなので、C++のクラス中心のライブラリを相手にすると実質的にC互換API設計を自分で始めることになる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/c-native-api/> ;
    schema:description "相手が最初からきれいなC APIを公開しているなら、C++/CLIよりP/Invokeのほうが素直である"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/com-marshaling/> ;
    schema:description "C++/CLIラッパーは境界でmarshal_asなどを使い、.NETの型とネイティブの型を相互に変換する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/dotnet/overview-of-marshaling-in-cpp?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/marshal-as/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/com-marshaling/> ;
    schema:description "marshal_asはC++/CLIが提供する変換ヘルパーで、msclr/marshal_cppstd.hなどのヘッダーを取り込んで.NETとネイティブの型のマーシャリングを実装する"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/cpp/dotnet/marshal-as?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/safehandle/> ;
    schema:description "P/InvokeでネイティブハンドルをC#側から扱う場合、IntPtrを裸で持ち回る代わりにSafeHandleを派生させ、ReleaseHandleから解放関数を呼ぶ"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/structlayout/> ;
    schema:description "P/Invokeで構造体をネイティブ側に合わせるには、StructLayout属性でLayoutKind.Sequentialなどのメモリ配置を指定する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/dispose-finalize-pattern/> ;
    schema:description "C++/CLIのデストラクター(~T())とファイナライザー(!T())は、コンパイラーによってそれぞれIDisposable.Dispose()とObject.Finalizeに変換される"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/dotnet/how-to-define-and-consume-classes-and-structs-cpp-cli?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ownership-lifetime-management/> ;
    schema:description "C++/CLIラッパーはネイティブ側の所有権・寿命の前提をC++側で受け止め、.NET側にはIDisposableとして安定した形を見せる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/exception-translation/> ;
    schema:description "C++/CLIラッパーはtry/catchでネイティブのC++例外を受け、意味のある.NET例外に変換して投げ直せる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/callback-delegate-lifetime/> ;
    schema:description "ネイティブ側にコールバックがある場合、その登録と解除をC++側に閉じ込めることで、C#側にはイベントやデリゲートだけを見せ、デリゲートの寿命管理をラッパー内に集約できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/callback-delegate-lifetime/> ;
    schema:description "P/Invokeでコールバックを扱う場合、デリゲートがGCに回収されないようフィールドなどで参照を保持し続ける必要がある"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/native-aot/> ;
    schema:description "Native AOTの非対応リストにC++/CLIが明記されており、PublishAotで単一のネイティブバイナリにする方針とは両立しない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ijwhost/> ;
    schema:description ".NET(Core系)をターゲットにするC++/CLIの出力には、ijwhost.dllを配置する必要がある(.NET Framework向けの出力では不要)"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/porting/cpp-cli> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/clr-compilation-flag/> ;
    schema:description "C++/CLIは/clrコンパイルオプションを指定してビルドし、これによりMSVCランタイム(/MD)も有効になる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/build/reference/clr-common-language-runtime-compilation?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/mixed-assembly/> ;
    schema:description "C++/CLIラッパーはネイティブの機械語命令とMSILの両方を含む混合アセンブリとしてビルドされる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/dotnet/mixed-native-and-managed-assemblies?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/c-api-bridge/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/c-native-api/> ;
    schema:description "P/Invoke向けのCブリッジ関数は、extern \"C\"で公開するC形式の関数として書く"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/c-api-bridge/> ;
    schema:description "C++のクラスライブラリを相手にする場合、C++/CLIラッパーは、P/Invoke向けに手書きするCブリッジ層に代わる位置づけになる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-cli/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/cross-platform-requirement/> ;
    schema:description "C++/CLIはWindows前提の技術であり、クロスプラットフォームが必要な場合は選択できない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/porting/cpp-cli> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
