@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/12/003-csharp-native-aot-native-dll-from-c-cpp/#article>
    schema:about <https://comcomponent.com/knowledge/native-aot/>, <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    schema:mentions <https://comcomponent.com/knowledge/c-abi/>, <https://comcomponent.com/knowledge/calling-convention/>, <https://comcomponent.com/knowledge/blittable-type/>, <https://comcomponent.com/knowledge/native-aot-publish-toolchain/>, <https://comcomponent.com/knowledge/p-invoke/>, <https://comcomponent.com/knowledge/cpp-cli/>, <https://comcomponent.com/knowledge/com-interop/>, <https://comcomponent.com/knowledge/native-to-managed-inprocess-call/>, <https://comcomponent.com/knowledge/csharp-calls-c-functions/>, <https://comcomponent.com/knowledge/csharp-calls-cpp-library/>, <https://comcomponent.com/knowledge/cross-process-or-bitness-boundary/>, <https://comcomponent.com/knowledge/status-code-error-convention/>, <https://comcomponent.com/knowledge/handle-based-api-design/>, <https://comcomponent.com/knowledge/handle-wraparound-collision/>, <https://comcomponent.com/knowledge/generation-embedded-handle/>, <https://comcomponent.com/knowledge/handle-counter-overflow/>, <https://comcomponent.com/knowledge/dumpbin/>, <https://comcomponent.com/knowledge/import-library/>, <https://comcomponent.com/knowledge/plugin-unload-requirement/>, <https://comcomponent.com/knowledge/dotnet/> .

<https://comcomponent.com/knowledge/native-aot/> a skos:Concept ;
    skos:prefLabel "Native AOT"@ja ;
    skos:definition ".NETアプリを単一のネイティブバイナリへ事前コンパイルする発行方式。非対応リストにC++/CLIが明記されている。"@ja ;
    skos:altLabel "PublishAot" ;
    ks:uses <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    ks:requires <https://comcomponent.com/knowledge/native-aot-publish-toolchain/> ;
    ks:requires <https://comcomponent.com/knowledge/dotnet/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/native-to-managed-inprocess-call/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/cross-process-or-bitness-boundary/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/plugin-unload-requirement/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/dumpbin/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/csharp-calls-c-functions/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/csharp-calls-cpp-library/> .

<https://comcomponent.com/knowledge/unmanagedcallersonly/> a skos:Concept ;
    skos:prefLabel "UnmanagedCallersOnly属性"@ja ;
    skos:definition "static メソッドに付与すると、そのメソッドをネイティブコードから直接呼び出せるCのエントリポイントとして公開できる.NETの属性。"@ja ;
    skos:altLabel "UnmanagedCallersOnlyAttribute" ;
    skos:broader <https://comcomponent.com/knowledge/native-aot/> ;
    ks:requires <https://comcomponent.com/knowledge/blittable-type/> ;
    ks:requires <https://comcomponent.com/knowledge/c-abi/> .

<https://comcomponent.com/knowledge/blittable-type/> a skos:Concept ;
    skos:prefLabel "blittable型"@ja ;
    skos:definition "マネージドコードとアンマネージドコードの間でメモリ表現が同一で、変換なしにそのまま受け渡せる型。UnmanagedCallersOnlyを付けたメソッドのシグネチャに使える型はこれに限られる。"@ja ;
    skos:altLabel "blittable types" ;
    skos:broader <https://comcomponent.com/knowledge/c-abi/> .

<https://comcomponent.com/knowledge/calling-convention/> a skos:Concept ;
    skos:prefLabel "呼び出し規約(calling convention)"@ja ;
    skos:definition "関数呼び出しで引数をレジスタとスタックのどちらでどう渡すか、戻り値をどこに置くか、呼び出し後にスタックを戻すのが呼ぶ側か呼ばれる側かを定める約束。"@ja ;
    skos:altLabel "cdecl" ;
    skos:altLabel "stdcall" ;
    skos:broader <https://comcomponent.com/knowledge/c-abi/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/unmanagedcallersonly/> .

<https://comcomponent.com/knowledge/c-abi/> a skos:Concept ;
    skos:prefLabel "C ABI(Application Binary Interface)"@ja ;
    skos:definition "コンパイル済みのバイナリ同士が実行時にどう噛み合うかを、呼び出し規約・型のレイアウト・名前とリンクという3つの約束で定める、機械語レベルの取り決め。"@ja ;
    skos:altLabel "C言語のABI"@ja ;
    ks:uses <https://comcomponent.com/knowledge/calling-convention/> .

<https://comcomponent.com/knowledge/native-aot-publish-toolchain/> a skos:Concept ;
    skos:prefLabel "Native AOT publish用のネイティブツールチェーン"@ja ;
    skos:definition "Native AOTのpublishで必要になる、最後のネイティブリンクを行うためのプラットフォーム別ツール一式(Windowsでは Visual Studio の C++ワークロード、Linuxではclangなど)。"@ja ;
    skos:altLabel "C++ワークロード"@ja ;
    skos:altLabel "clang" ;
    skos:broader <https://comcomponent.com/knowledge/native-aot/> .

<https://comcomponent.com/knowledge/dotnet/> a skos:Concept ;
    skos:prefLabel ".NET(Core以降)"@ja ;
    skos:definition ".NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。"@ja ;
    skos:altLabel ".NET Core" ;
    skos:altLabel "モダンな.NET"@ja .

<https://comcomponent.com/knowledge/native-to-managed-inprocess-call/> a skos:Concept ;
    skos:prefLabel "C/C++からC#ロジックをin-processで呼ぶ要件"@ja ;
    skos:definition "既存のネイティブアプリ本体は残したまま、判定ロジックや文字列処理などの一部だけをC#に寄せ、同一プロセス内から呼び出したいという要件。"@ja .

<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/csharp-calls-c-functions/> .

<https://comcomponent.com/knowledge/csharp-calls-c-functions/> a skos:Concept ;
    skos:prefLabel "C#からCの関数群を呼ぶ要件"@ja ;
    skos:definition "C#のコードから既存のアンマネージドなC関数群を呼び出したいという要件。"@ja .

<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/csharp-calls-cpp-library/> .

<https://comcomponent.com/knowledge/csharp-calls-cpp-library/> a skos:Concept ;
    skos:prefLabel "C#からC++ライブラリを自然に扱う要件"@ja ;
    skos:definition "C++のクラスや所有権、std::wstringのようなC++固有の型・例外をC#側で自然に扱いたいという要件。"@ja .

<https://comcomponent.com/knowledge/com-interop/> a skos:Concept ;
    skos:prefLabel "COM(Component Object Model)"@ja ;
    skos:definition "プロセス内外・言語をまたいでオブジェクトを利用可能にするMicrosoftのバイナリ相互運用規格で、32bit/64bitやプロセス境界を越える橋渡しにも使われる。"@ja ;
    skos:altLabel "COM interop" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/cross-process-or-bitness-boundary/> .

<https://comcomponent.com/knowledge/cross-process-or-bitness-boundary/> a skos:Concept ;
    skos:prefLabel "32bit/64bitまたはプロセス境界を越える要件"@ja ;
    skos:definition "32bitプロセスと64bitプロセスの間、または別プロセスとの間でコードやデータをやり取りしたいという要件で、in-processのDLL呼び出しだけでは越えられない。"@ja .

<https://comcomponent.com/knowledge/plugin-unload-requirement/> a skos:Concept ;
    skos:prefLabel "プラグインを後でアンロードしたい要件"@ja ;
    skos:definition "一度読み込んだネイティブ共有ライブラリを、プロセスを終了せずに後からメモリから解放したいという要件。"@ja .

<https://comcomponent.com/knowledge/status-code-error-convention/> a skos:Concept ;
    skos:prefLabel "エラーをstatus codeで返す設計"@ja ;
    skos:definition "ネイティブ境界を越える関数の戻り値をエラーコードとし、実データはoutバッファやポインタ引数で返す、managed例外を境界に漏らさないための設計方針。"@ja ;
    skos:altLabel "error code + out引数"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/unmanagedcallersonly/> .

<https://comcomponent.com/knowledge/handle-based-api-design/> a skos:Concept ;
    skos:prefLabel "ハンドルベースのC API設計(create/destroy/operate)"@ja ;
    skos:definition "ネイティブ側にはintptr_t相当のハンドルだけを見せ、状態本体は.NET側で保持しながらcreate/add/get/destroyのようなフラットな関数に分解するAPI設計パターン。"@ja ;
    skos:altLabel "create/destroy/operateパターン"@ja ;
    skos:broader <https://comcomponent.com/knowledge/c-abi/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/unmanagedcallersonly/> .

<https://comcomponent.com/knowledge/handle-counter-overflow/> a skos:Concept ;
    skos:prefLabel "ハンドル採番カウンターのオーバーフロー"@ja ;
    skos:definition "long型の採番カウンターをnint(32bitビルドでは32bit幅)へキャストする際に上位ビットが黙って捨てられ、採番が2^32を超えると値が一周する現象。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/handle-based-api-design/> .

<https://comcomponent.com/knowledge/handle-wraparound-collision/> a skos:Concept ;
    skos:prefLabel "ハンドル一周による衝突"@ja ;
    skos:definition "採番用カウンターが上限に達して同じハンドル値に戻ってきたとき、辞書の重複キー検査をすり抜けて、ネイティブ側が持ったままの古いハンドルが無関係な新しいインスタンスを指すようになる状態。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/handle-based-api-design/> .

<https://comcomponent.com/knowledge/generation-embedded-handle/> a skos:Concept ;
    skos:prefLabel "世代番号を埋め込んだハンドル設計"@ja ;
    skos:definition "ハンドルの下位ビットを連番、上位ビットを世代番号とし、destroyのたびに世代を進めることで、同じ連番が巡ってきても値が一致しないようにするハンドル設計。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/handle-based-api-design/> ;
    ks:prevents <https://comcomponent.com/knowledge/handle-wraparound-collision/> .

<https://comcomponent.com/knowledge/dumpbin/> a skos:Concept ;
    skos:prefLabel "dumpbin"@ja ;
    skos:definition "DLLやライブラリのエクスポート・インポート情報を表示できる、Visual Studio付属のコマンドラインツール。"@ja ;
    skos:altLabel "DUMPBIN /EXPORTS" .

<https://comcomponent.com/knowledge/import-library/> a skos:Concept ;
    skos:prefLabel "インポートライブラリ(.lib)"@ja ;
    skos:definition "DLLの関数を実行時のLoadLibrary/GetProcAddressを介さず、リンク時に静的に解決できるようにするための.libファイル。"@ja ;
    skos:altLabel "import lib" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/native-aot/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    schema:description "Native AOTで発行するC#のクラスライブラリは、UnmanagedCallersOnlyを付けたメソッドをCのエントリポイントとして公開できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/interop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/blittable-type/> ;
    schema:description "UnmanagedCallersOnlyを付けたメソッドのシグネチャには、blittableな型しか使えない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/calling-convention/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    schema:description "呼び出し規約はUnmanagedCallersOnlyのCallConvsパラメーターで、cdeclなどを明示的に固定できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute.callconvs?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/c-abi/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/calling-convention/> ;
    schema:description "C ABIは呼び出し規約・型のレイアウト・名前とリンクという3つの約束から成り、呼び出し規約はその構成要素の1つ。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/c-abi/> ;
    schema:description "exportされるのはあくまでCの関数入口であり、境界面は.NETではなくC ABIとして設計する必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/interop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/native-aot/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/native-aot-publish-toolchain/> ;
    schema:description "Native AOTのpublishには、ネイティブのツールチェーンが別途必要で、無いとC#のコンパイルではなく最後のネイティブリンクの段階で失敗する。"@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/native-aot/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/dotnet/> ;
    schema:description "Native AOTは.NET SDKのpublish機能であり、.NET(Core以降)であることを前提とする。"@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/native-aot/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/native-to-managed-inprocess-call/> ;
    schema:description "C/C++からC#の処理をin-processで呼びたいという要件では、Native AOT + UnmanagedCallersOnlyが有力な選択肢になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/interop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/csharp-calls-c-functions/> ;
    schema:description "C#からCの関数群を呼ぶ場合は、向きが素直なP/Invokeが自然な選択肢になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/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/csharp-calls-cpp-library/> ;
    schema:description "C#からC++ライブラリを自然に扱いたい場合は、C++の型や所有権、例外を吸収しやすいC++/CLIが向く。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/com-interop/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/cross-process-or-bitness-boundary/> ;
    schema:description "32bit/64bitやプロセス境界を越えたい場合は、in-process DLLでは越えられないためCOM/IPCの方が筋がよい。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/component-object-model--com--portal> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/native-aot/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/cross-process-or-bitness-boundary/> ;
    schema:description "32bit/64bitを橋渡ししたい、またはプロセス境界を越えたい場合には、in-process DLLであるNative AOTの構成は向かない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/interop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/native-aot/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/plugin-unload-requirement/> ;
    schema:description "Native AOTで発行した共有ライブラリはアンロード前提では使わないほうがよい。"@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/status-code-error-convention/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    schema:description "managed例外をそのまま呼び出し元へ漏らさず、戻り値をstatus code、実データをoutポインタ引数で返す設計が、UnmanagedCallersOnlyの境界では実務上推奨される。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/interop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/handle-based-api-design/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    schema:description "create/destroy/operateのようなフラットなC APIに落として寿命管理とエラーコードを明示する設計が、UnmanagedCallersOnlyの境界では実務上安定する。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/interop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/handle-counter-overflow/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/handle-wraparound-collision/> ;
    schema:description "32bitビルドで採番カウンターが2^32を超えて一周すると、破棄済みの辞書キーに同じハンドル値が戻ってきて再利用され、無関係な新しいインスタンスを指すようになり得る。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generation-embedded-handle/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/handle-wraparound-collision/> ;
    schema:description "下位を連番、上位を世代番号とし destroy のたびに世代を進めることで、同じ連番が巡ってきても値が一致しなくなり衝突を防げる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/native-aot/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/dumpbin/> ;
    schema:description "Native AOTで発行したDLLに目的の関数が実際にexportされているかは、dumpbin /exportsで確認できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/build/reference/dash-exports> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/import-library/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/native-aot/> ;
    schema:description "呼び出し側を静的リンクにしたい場合のインポートライブラリは、Native AOTがpublishしたDLL(またはそのexport名一覧)を前提に作成する。ただしインポートライブラリ一般がNative AOTを前提とするわけではなく、この対応関係はNative AOTが発行したDLLに対して作成する場合に限られる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/build/reference/lib-reference> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/native-aot/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/csharp-calls-c-functions/> ;
    schema:description "「C#からCの関数群を呼ぶ」場面ではP/Invokeが有力候補として挙げられており、Native AOT + UnmanagedCallersOnlyはこれとは逆向き(C/C++からC#)の場面のための構成である。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/native-aot/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/csharp-calls-cpp-library/> ;
    schema:description "C++のクラスやstd::vectorや例外をそのまま扱いたい場合は、C++/CLIかネイティブ側ラッパーのほうが自然で、Native AOTのC ABI越しの構成には向かない。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/handle-based-api-design/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/handle-wraparound-collision/> ;
    schema:description "ハンドルベースのAPI設計で採番カウンターを32bit幅のnintへキャストすると、32bitビルドでは採番が一周し得る。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
