Native AOTでC#をネイティブDLLとしてC/C++から呼ぶ知識マップ(知識グラフ)
type: Dataset
description: C#のNative AOTはUnmanagedCallersOnly属性を付けたメソッドをCのエントリポイントとして公開でき、既存のC/C++アプリからin-processでC#のロジックだけを呼び出せる構成を実現する。ただし境界に出せるのはblittableな型に限られるため、実務ではstringやList<T>を直接見せずcreate/destroy/operateのようなハンドルベースのC APIに落とし、呼び出し規約を明示し、例外の代わりにstatus codeでエラーを表現する設計が推奨される。この構成はC/C++がC#ロジックを呼ぶ向きに適する一方、C#からCを呼ぶならP/Invoke、C#からC++を自然に扱うならC++/CLI、32bit/64bitやプロセス境界を越えたい場合やアンロードしたい場合はCOM/IPCの方が向く。ハンドルの採番を32bit幅で使い回すと一周時に無関係なインスタンスを指す危険があり、世代番号の埋め込みが対策になる。

Native AOT
type: Concept
definition: .NETアプリを単一のネイティブバイナリへ事前コンパイルする発行方式。非対応リストにC++/CLIが明記されている。
alternative label: PublishAot
uses: UnmanagedCallersOnly属性
requires: Native AOT publish用のネイティブツールチェーン
requires: .NET(Core以降)
recommended for: C/C++からC#ロジックをin-processで呼ぶ要件
not recommended for: 32bit/64bitまたはプロセス境界を越える要件
not recommended for: プラグインを後でアンロードしたい要件
not recommended for: C#からCの関数群を呼ぶ要件
not recommended for: C#からC++ライブラリを自然に扱う要件
verified by: dumpbin

UnmanagedCallersOnly属性
type: Concept
definition: static メソッドに付与すると、そのメソッドをネイティブコードから直接呼び出せるCのエントリポイントとして公開できる.NETの属性。
alternative label: UnmanagedCallersOnlyAttribute
broader: Native AOT
requires: blittable型
requires: C ABI(Application Binary Interface)

blittable型
type: Concept
definition: マネージドコードとアンマネージドコードの間でメモリ表現が同一で、変換なしにそのまま受け渡せる型。UnmanagedCallersOnlyを付けたメソッドのシグネチャに使える型はこれに限られる。
alternative label: blittable types
broader: C ABI(Application Binary Interface)

呼び出し規約(calling convention)
type: Concept
definition: 関数呼び出しで引数をレジスタとスタックのどちらでどう渡すか、戻り値をどこに置くか、呼び出し後にスタックを戻すのが呼ぶ側か呼ばれる側かを定める約束。
alternative label: cdecl
alternative label: stdcall
broader: C ABI(Application Binary Interface)
configured by: UnmanagedCallersOnly属性

C ABI(Application Binary Interface)
type: Concept
definition: コンパイル済みのバイナリ同士が実行時にどう噛み合うかを、呼び出し規約・型のレイアウト・名前とリンクという3つの約束で定める、機械語レベルの取り決め。
alternative label: C言語のABI
uses: 呼び出し規約(calling convention)

Native AOT publish用のネイティブツールチェーン
type: Concept
definition: Native AOTのpublishで必要になる、最後のネイティブリンクを行うためのプラットフォーム別ツール一式(Windowsでは Visual Studio の C++ワークロード、Linuxではclangなど)。
alternative label: C++ワークロード
alternative label: clang
broader: Native AOT

.NET(Core以降)
type: Concept
definition: .NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。
alternative label: .NET Core
alternative label: モダンな.NET

C/C++からC#ロジックをin-processで呼ぶ要件
type: Concept
definition: 既存のネイティブアプリ本体は残したまま、判定ロジックや文字列処理などの一部だけをC#に寄せ、同一プロセス内から呼び出したいという要件。

P/Invoke
type: Concept
definition: C#などの.NETコードからアンマネージドなC関数群を呼び出すための、.NETの標準的な相互運用機構。
alternative label: Platform Invoke
alternative label: P/Invoke(Platform Invoke)
alternative label: DllImport
recommended for: C#からCの関数群を呼ぶ要件

C#からCの関数群を呼ぶ要件
type: Concept
definition: C#のコードから既存のアンマネージドなC関数群を呼び出したいという要件。

C++/CLI
type: Concept
definition: ネイティブC++とマネージド.NETの両方を1つのプロジェクトで扱えるMicrosoftの言語拡張。ネイティブDLLとC#の間に薄いラッパー層を作るのに使われる。
alternative label: C++/CLIラッパー
recommended for: C#からC++ライブラリを自然に扱う要件

C#からC++ライブラリを自然に扱う要件
type: Concept
definition: C++のクラスや所有権、std::wstringのようなC++固有の型・例外をC#側で自然に扱いたいという要件。

COM(Component Object Model)
type: Concept
definition: プロセス内外・言語をまたいでオブジェクトを利用可能にするMicrosoftのバイナリ相互運用規格で、32bit/64bitやプロセス境界を越える橋渡しにも使われる。
alternative label: COM interop
recommended for: 32bit/64bitまたはプロセス境界を越える要件

32bit/64bitまたはプロセス境界を越える要件
type: Concept
definition: 32bitプロセスと64bitプロセスの間、または別プロセスとの間でコードやデータをやり取りしたいという要件で、in-processのDLL呼び出しだけでは越えられない。

プラグインを後でアンロードしたい要件
type: Concept
definition: 一度読み込んだネイティブ共有ライブラリを、プロセスを終了せずに後からメモリから解放したいという要件。

エラーをstatus codeで返す設計
type: Concept
definition: ネイティブ境界を越える関数の戻り値をエラーコードとし、実データはoutバッファやポインタ引数で返す、managed例外を境界に漏らさないための設計方針。
alternative label: error code + out引数
recommended for: UnmanagedCallersOnly属性

ハンドルベースのC API設計(create/destroy/operate)
type: Concept
definition: ネイティブ側にはintptr_t相当のハンドルだけを見せ、状態本体は.NET側で保持しながらcreate/add/get/destroyのようなフラットな関数に分解するAPI設計パターン。
alternative label: create/destroy/operateパターン
broader: C ABI(Application Binary Interface)
recommended for: UnmanagedCallersOnly属性

ハンドル採番カウンターのオーバーフロー
type: Concept
definition: long型の採番カウンターをnint(32bitビルドでは32bit幅)へキャストする際に上位ビットが黙って捨てられ、採番が2^32を超えると値が一周する現象。
broader: ハンドルベースのC API設計(create/destroy/operate)

ハンドル一周による衝突
type: Concept
definition: 採番用カウンターが上限に達して同じハンドル値に戻ってきたとき、辞書の重複キー検査をすり抜けて、ネイティブ側が持ったままの古いハンドルが無関係な新しいインスタンスを指すようになる状態。
broader: ハンドルベースのC API設計(create/destroy/operate)

世代番号を埋め込んだハンドル設計
type: Concept
definition: ハンドルの下位ビットを連番、上位ビットを世代番号とし、destroyのたびに世代を進めることで、同じ連番が巡ってきても値が一致しないようにするハンドル設計。
broader: ハンドルベースのC API設計(create/destroy/operate)
prevents: ハンドル一周による衝突

dumpbin
type: Concept
definition: DLLやライブラリのエクスポート・インポート情報を表示できる、Visual Studio付属のコマンドラインツール。
alternative label: DUMPBIN /EXPORTS

インポートライブラリ(.lib)
type: Concept
definition: DLLの関数を実行時のLoadLibrary/GetProcAddressを介さず、リンク時に静的に解決できるようにするための.libファイル。
alternative label: import lib

subject: Native AOT
predicate: uses
object: UnmanagedCallersOnly属性
description: Native AOTで発行するC#のクラスライブラリは、UnmanagedCallersOnlyを付けたメソッドをCのエントリポイントとして公開できる。
evidence: interop
verified at: 2026-08-01
certainty: established

subject: UnmanagedCallersOnly属性
predicate: requires
object: blittable型
description: UnmanagedCallersOnlyを付けたメソッドのシグネチャには、blittableな型しか使えない。
evidence: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute
verified at: 2026-08-01
certainty: established

subject: 呼び出し規約(calling convention)
predicate: configuredBy
object: UnmanagedCallersOnly属性
description: 呼び出し規約はUnmanagedCallersOnlyのCallConvsパラメーターで、cdeclなどを明示的に固定できる。
evidence: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute.callconvs
verified at: 2026-08-01
certainty: established

subject: C ABI(Application Binary Interface)
predicate: uses
object: 呼び出し規約(calling convention)
description: C ABIは呼び出し規約・型のレイアウト・名前とリンクという3つの約束から成り、呼び出し規約はその構成要素の1つ。
evidence: argument-passing-and-naming-conventions
verified at: 2026-08-01
certainty: established

subject: UnmanagedCallersOnly属性
predicate: requires
object: C ABI(Application Binary Interface)
description: exportされるのはあくまでCの関数入口であり、境界面は.NETではなくC ABIとして設計する必要がある。
evidence: interop
verified at: 2026-08-01
certainty: established

subject: Native AOT
predicate: requires
object: Native AOT publish用のネイティブツールチェーン
description: Native AOTのpublishには、ネイティブのツールチェーンが別途必要で、無いとC#のコンパイルではなく最後のネイティブリンクの段階で失敗する。
evidence: native-aot
verified at: 2026-08-01
certainty: established

subject: Native AOT
predicate: requires
object: .NET(Core以降)
description: Native AOTは.NET SDKのpublish機能であり、.NET(Core以降)であることを前提とする。
evidence: native-aot
verified at: 2026-08-01
certainty: established

subject: Native AOT
predicate: recommendedFor
object: C/C++からC#ロジックをin-processで呼ぶ要件
description: C/C++からC#の処理をin-processで呼びたいという要件では、Native AOT + UnmanagedCallersOnlyが有力な選択肢になる。
evidence: interop
verified at: 2026-08-01
certainty: established

subject: P/Invoke
predicate: recommendedFor
object: C#からCの関数群を呼ぶ要件
description: C#からCの関数群を呼ぶ場合は、向きが素直なP/Invokeが自然な選択肢になる。
evidence: pinvoke
verified at: 2026-08-01
certainty: established

subject: C++/CLI
predicate: recommendedFor
object: C#からC++ライブラリを自然に扱う要件
description: C#からC++ライブラリを自然に扱いたい場合は、C++の型や所有権、例外を吸収しやすいC++/CLIが向く。
evidence: dotnet-programming-with-cpp-cli-visual-cpp
verified at: 2026-08-01
certainty: established

subject: COM(Component Object Model)
predicate: recommendedFor
object: 32bit/64bitまたはプロセス境界を越える要件
description: 32bit/64bitやプロセス境界を越えたい場合は、in-process DLLでは越えられないためCOM/IPCの方が筋がよい。
evidence: component-object-model--com--portal
verified at: 2026-08-01
certainty: established

subject: Native AOT
predicate: notRecommendedFor
object: 32bit/64bitまたはプロセス境界を越える要件
description: 32bit/64bitを橋渡ししたい、またはプロセス境界を越えたい場合には、in-process DLLであるNative AOTの構成は向かない。
evidence: interop
verified at: 2026-08-01
certainty: established

subject: Native AOT
predicate: notRecommendedFor
object: プラグインを後でアンロードしたい要件
description: Native AOTで発行した共有ライブラリはアンロード前提では使わないほうがよい。
evidence: native-aot
verified at: 2026-08-01
certainty: established

subject: エラーをstatus codeで返す設計
predicate: recommendedFor
object: UnmanagedCallersOnly属性
description: managed例外をそのまま呼び出し元へ漏らさず、戻り値をstatus code、実データをoutポインタ引数で返す設計が、UnmanagedCallersOnlyの境界では実務上推奨される。
evidence: interop
verified at: 2026-08-01
certainty: established

subject: ハンドルベースのC API設計(create/destroy/operate)
predicate: recommendedFor
object: UnmanagedCallersOnly属性
description: create/destroy/operateのようなフラットなC APIに落として寿命管理とエラーコードを明示する設計が、UnmanagedCallersOnlyの境界では実務上安定する。
evidence: interop
verified at: 2026-08-01
certainty: established

subject: ハンドル採番カウンターのオーバーフロー
predicate: mayCause
object: ハンドル一周による衝突
description: 32bitビルドで採番カウンターが2^32を超えて一周すると、破棄済みの辞書キーに同じハンドル値が戻ってきて再利用され、無関係な新しいインスタンスを指すようになり得る。
evidence: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute
verified at: 2026-08-01
certainty: context-dependent

subject: 世代番号を埋め込んだハンドル設計
predicate: prevents
object: ハンドル一周による衝突
description: 下位を連番、上位を世代番号とし destroy のたびに世代を進めることで、同じ連番が巡ってきても値が一致しなくなり衝突を防げる。
evidence: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute
verified at: 2026-08-01
certainty: established

subject: Native AOT
predicate: verifiedBy
object: dumpbin
description: Native AOTで発行したDLLに目的の関数が実際にexportされているかは、dumpbin /exportsで確認できる。
evidence: dash-exports
verified at: 2026-08-01
certainty: established

subject: インポートライブラリ(.lib)
predicate: requires
object: Native AOT
description: 呼び出し側を静的リンクにしたい場合のインポートライブラリは、Native AOTがpublishしたDLL(またはそのexport名一覧)を前提に作成する。ただしインポートライブラリ一般がNative AOTを前提とするわけではなく、この対応関係はNative AOTが発行したDLLに対して作成する場合に限られる。
evidence: lib-reference
verified at: 2026-08-01
certainty: context-dependent

subject: Native AOT
predicate: notRecommendedFor
object: C#からCの関数群を呼ぶ要件
description: 「C#からCの関数群を呼ぶ」場面ではP/Invokeが有力候補として挙げられており、Native AOT + UnmanagedCallersOnlyはこれとは逆向き(C/C++からC#)の場面のための構成である。
evidence: pinvoke
verified at: 2026-08-01
certainty: established

subject: Native AOT
predicate: notRecommendedFor
object: C#からC++ライブラリを自然に扱う要件
description: C++のクラスやstd::vectorや例外をそのまま扱いたい場合は、C++/CLIかネイティブ側ラッパーのほうが自然で、Native AOTのC ABI越しの構成には向かない。
evidence: dotnet-programming-with-cpp-cli-visual-cpp
verified at: 2026-08-01
certainty: established

subject: ハンドルベースのC API設計(create/destroy/operate)
predicate: mayCause
object: ハンドル一周による衝突
description: ハンドルベースのAPI設計で採番カウンターを32bit幅のnintへキャストすると、32bitビルドでは採番が一周し得る。
evidence: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute
verified at: 2026-08-01
certainty: context-dependent