@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/ada-c-csharp-dll-interop/#article>
    schema:about <https://comcomponent.com/knowledge/ada-c-interop/> ;
    schema:mentions <https://comcomponent.com/knowledge/ada/>, <https://comcomponent.com/knowledge/gnat/>, <https://comcomponent.com/knowledge/c-abi/>, <https://comcomponent.com/knowledge/calling-convention/>, <https://comcomponent.com/knowledge/win32-api/>, <https://comcomponent.com/knowledge/gprbuild/>, <https://comcomponent.com/knowledge/ada-stand-alone-library/>, <https://comcomponent.com/knowledge/ada-elaboration/>, <https://comcomponent.com/knowledge/ada-task/>, <https://comcomponent.com/knowledge/dll/>, <https://comcomponent.com/knowledge/dll-search-order/>, <https://comcomponent.com/knowledge/p-invoke/>, <https://comcomponent.com/knowledge/libraryimport/>, <https://comcomponent.com/knowledge/dllimport/>, <https://comcomponent.com/knowledge/stringmarshalling/>, <https://comcomponent.com/knowledge/unhandled-exception/> .

<https://comcomponent.com/knowledge/ada-c-interop/> a skos:Concept ;
    skos:prefLabel "AdaとC/C++の相互運用(Annex B)"@ja ;
    skos:definition "Ada参照マニュアルの附属書Bで標準化された、C・Fortranなど他言語とのインターフェース機構。ImportやExportで双方向の呼び出しができる。"@ja ;
    skos:altLabel "Annex B" ;
    skos:altLabel "Interfaces.C" ;
    ks:uses <https://comcomponent.com/knowledge/c-abi/> ;
    ks:uses <https://comcomponent.com/knowledge/calling-convention/> .

<https://comcomponent.com/knowledge/ada/> a skos:Concept ;
    skos:prefLabel "Ada(プログラミング言語)"@ja ;
    skos:definition "1970年代後半にアメリカ国防総省の主導で標準化された、強い型付けと高信頼性を重視する汎用プログラミング言語。最新標準はAda 2022。"@ja ;
    skos:altLabel "Ada言語"@ja ;
    skos:altLabel "Ada 2022" ;
    ks:implements <https://comcomponent.com/knowledge/ada-c-interop/> .

<https://comcomponent.com/knowledge/gnat/> a skos:Concept ;
    skos:prefLabel "GNAT"@ja ;
    skos:definition "GCCに含まれる無償のAdaコンパイラで、Adaの代表的な処理系。"@ja ;
    skos:altLabel "GNATコンパイラ"@ja ;
    ks:implements <https://comcomponent.com/knowledge/ada/> .

<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 .

<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/> .

<https://comcomponent.com/knowledge/win32-api/> a skos:Concept ;
    skos:prefLabel "Win32 API"@ja ;
    skos:definition "Windowsのネイティブなアプリケーション開発向けAPI群。"@ja ;
    skos:altLabel "Windows API" ;
    ks:requires <https://comcomponent.com/knowledge/calling-convention/> .

<https://comcomponent.com/knowledge/ada-stand-alone-library/> a skos:Concept ;
    skos:prefLabel "スタンドアロンライブラリ(Stand-alone Library)"@ja ;
    skos:definition "GPRbuildのライブラリプロジェクトでLibrary_Interfaceに外部へ見せるユニットを指定して作るAdaのライブラリ。初期化と終了処理の手続きを持ち、Ada以外の言語のプログラムから使える。"@ja ;
    skos:altLabel "Stand-alone Library" ;
    skos:altLabel "SAL" ;
    skos:altLabel "Library_Interface" ;
    ks:configuredBy <https://comcomponent.com/knowledge/gprbuild/> .

<https://comcomponent.com/knowledge/gprbuild/> a skos:Concept ;
    skos:prefLabel "GPRbuild"@ja ;
    skos:definition "GNATのプロジェクトファイル(.gpr)を読み、Adaや他言語のソースのコンパイル、バインド、リンクを行うAdaCoreのビルドツール。静的・共有ライブラリも作れる。"@ja ;
    skos:altLabel "gprbuild" .

<https://comcomponent.com/knowledge/ada-elaboration/> a skos:Concept ;
    skos:prefLabel "エラボレーション(elaboration)"@ja ;
    skos:definition "宣言が実行時の効果を得る処理。ライブラリユニットでは、パッケージ本体の初期化の文や変数の初期値の計算が含まれ、ユニットを使う前に行う必要がある。"@ja ;
    skos:altLabel "elaboration" ;
    skos:altLabel "Adaの初期化"@ja .

<https://comcomponent.com/knowledge/ada-task/> a skos:Concept ;
    skos:prefLabel "Adaのタスク(並行処理)"@ja ;
    skos:definition "スレッドをOSのAPIやライブラリに頼らず、言語仕様に組み込む形で提供するAdaの並行実行単位。"@ja ;
    skos:altLabel "task" ;
    skos:altLabel "rendezvous" .

<https://comcomponent.com/knowledge/dll/> a skos:Concept ;
    skos:prefLabel "DLL(ダイナミックリンクライブラリ)"@ja ;
    skos:definition "実行時に読み込まれ、関数やデータを他のモジュールと共有できるWindowsのバイナリモジュール。"@ja ;
    skos:altLabel "Dynamic Link Library" ;
    skos:altLabel "動的リンクライブラリ"@ja .

<https://comcomponent.com/knowledge/dll-search-order/> a skos:Concept ;
    skos:prefLabel "DLLの検索順序"@ja ;
    skos:definition "Windowsが実行ファイルの起動時に限らず、LoadLibrary系APIによる動的な読み込み時も含めて、DLL redirectionやKnown DLLsなどの前段ルールを経てDLLを探す、決まった順序でフォルダーを辿る仕組み。"@ja ;
    skos:altLabel "DLL探索順"@ja .

<https://comcomponent.com/knowledge/libraryimport/> a skos:Concept ;
    skos:prefLabel "LibraryImport"@ja ;
    skos:definition ".NET 7で追加された、partialメソッドに対しコンパイル時にP/Invokeのマーシャリングコードを生成するソースジェネレーター。"@ja ;
    skos:altLabel "LibraryImportAttribute" ;
    ks:implements <https://comcomponent.com/knowledge/p-invoke/> ;
    ks:uses <https://comcomponent.com/knowledge/stringmarshalling/> .

<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:uses <https://comcomponent.com/knowledge/dll/> .

<https://comcomponent.com/knowledge/dllimport/> a skos:Concept ;
    skos:prefLabel "DllImport"@ja ;
    skos:definition "P/Invoke宣言に対して実行時にランタイムがマーシャリング用のILスタブを生成する、従来からの属性ベースの仕組み。"@ja ;
    skos:altLabel "DllImportAttribute" ;
    ks:implements <https://comcomponent.com/knowledge/p-invoke/> .

<https://comcomponent.com/knowledge/stringmarshalling/> a skos:Concept ;
    skos:prefLabel "StringMarshalling"@ja ;
    skos:definition "LibraryImportで文字列のマーシャリング方式(Utf16/Utf8等)を明示するプロパティ。DllImport時代のCharSetに代わるもの。"@ja ;
    skos:altLabel "CharSet" .

<https://comcomponent.com/knowledge/unhandled-exception/> a skos:Concept ;
    skos:prefLabel "未処理例外"@ja ;
    skos:definition "アプリケーションのどこでもキャッチされないままランタイムまで届き、プロセスを終了させる例外である。"@ja ;
    skos:altLabel "unhandled exception" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/ada-c-interop/> ;
    schema:description "AdaはC言語などほかの言語とのインターフェースを参照マニュアルの附属書Bに定めており、ImportとExportでほかの言語の関数を呼んだり、Adaの関数を公開したりできる。"@ja ;
    ks:evidence <https://ada-lang.io/docs/arm/AA-B/AA-B.1/> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/gnat/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/ada/> ;
    schema:description "記事の例は、Adaの処理系であるGNAT 13でビルドしている。"@ja ;
    ks:evidence <https://gcc.gnu.org/onlinedocs/gnat_ugn/> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-c-interop/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/c-abi/> ;
    schema:description "Convention => Cを付けた関数はCと同じ呼び方になり、External_Nameで付けた名前でリンクされる。引数にはCの同名の型に対応するInterfaces.Cの型を使う。"@ja ;
    ks:evidence <https://ada-lang.io/docs/arm/AA-B/AA-B.1/>, <https://ada-lang.io/docs/arm/AA-B/AA-B.3/> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-c-interop/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/calling-convention/> ;
    schema:description "呼び出し規約はConventionで指定する。GNATでは、Stdcallは64ビットのWindowsでは無視され(規約が1つしかないため)、Windows以外ではCとして扱われる。"@ja ;
    ks:evidence <https://docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/platform_specific_information.html> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/win32-api/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/calling-convention/> ;
    schema:description "Win32 APIの関数は__stdcallの呼び出し規約で呼ぶので、AdaからImportするときはConvention => Stdcallを指定する。x64とARMではこの指定は無視される。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/cpp/stdcall>, <https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-stand-alone-library/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/gprbuild/> ;
    schema:description "GPRbuildのライブラリプロジェクトでLibrary_Kindを\"dynamic\"にし、Library_Interfaceに外部へ見せるユニットを指定すると、スタンドアロンライブラリの共有ライブラリができる。"@ja ;
    ks:evidence <https://docs.adacore.com/gprbuild-docs/html/gprbuild_ug/gnat_project_manager.html> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-stand-alone-library/> ;
    rdf:predicate ks:automates ;
    rdf:object <https://comcomponent.com/knowledge/ada-elaboration/> ;
    schema:description "Library_Auto_Initを指定しないか\"true\"にすると、自動の初期化に対応したプラットフォームではライブラリの読み込み時にエラボレーションが行われる。\"false\"なら、利用者が初期化の手続き(<ライブラリ名>init)を呼ぶ必要がある。"@ja ;
    ks:evidence <https://docs.adacore.com/gprbuild-docs/html/gprbuild_ug/gnat_project_manager.html> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-task/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/ada-stand-alone-library/> ;
    schema:description "WindowsではDllMainの中でスレッドを作れないため、ライブラリのレベルで宣言したタスクはスタンドアロンライブラリでは使えない。"@ja ;
    ks:evidence <https://docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/platform_specific_information.html> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-stand-alone-library/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/dll/> ;
    schema:description "記事の例では、MinGW-w64版のGNATでWindows向けにビルドしたスタンドアロンライブラリはlibgreet.dllというDLLになり、GNATのランタイムのlibgnat-13.dllとlibgcc_s_seh-1.dllに依存した。"@ja ;
    ks:evidence <https://docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/platform_specific_information.html> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dll/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/dll-search-order/> ;
    schema:description "Adaで作ったDLLとGNATのランタイムのDLLは、WindowsがDLLを探すフォルダーと順序で見つかる場所に置く必要がある。記事のWineでの実験では、libgnat-13.dllを取り除くとプログラムが起動しなかった。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libraryimport/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/p-invoke/> ;
    schema:description "LibraryImportはP/Invokeの宣言に対して、マーシャリングのコードをコンパイル時に生成する。使うプロジェクトではAllowUnsafeBlocksを有効にする必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dllimport/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/p-invoke/> ;
    schema:description "DllImportはP/Invokeの宣言に対して、実行時にILスタブを生成して呼び出す。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libraryimport/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/stringmarshalling/> ;
    schema:description "LibraryImportでは文字列の渡し方をStringMarshallingで指定する。記事の例ではUtf8を指定し、C#の文字列をUTF-8のNUL終端の文字列としてAdaに渡している。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-11-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/dll/> ;
    schema:description ".NETはDllImportやLibraryImportに書いた名前からファイル名を作って探す。Windowsではlibを前に付けないので、gprbuildが作るlibgreet.dllにはlibgreetと書く。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/native-library-loading> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-c-interop/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/unhandled-exception/> ;
    schema:description "公開した関数の中で処理しなかったAdaの例外は呼び出し側に届かない。記事のLinuxでの実験では、CからでもC#のtryの中からでも、GNATのランタイムがメッセージを出してプロセスが終了した。関数の中で例外を処理し、エラーコードで返せば防げる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/native-interop/exceptions-interoperability> ;
    ks:verifiedAt "2026-11-01" ;
    ks:certainty "context-dependent" .
