@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/pinvoke-safe-guide/#article>
    schema:about <https://comcomponent.com/knowledge/p-invoke/>, <https://comcomponent.com/knowledge/libraryimport/> ;
    schema:mentions <https://comcomponent.com/knowledge/dllimport/>, <https://comcomponent.com/knowledge/cswin32/>, <https://comcomponent.com/knowledge/safehandle/>, <https://comcomponent.com/knowledge/native-aot/>, <https://comcomponent.com/knowledge/il-stub/>, <https://comcomponent.com/knowledge/structlayout-pack/>, <https://comcomponent.com/knowledge/stringmarshalling/>, <https://comcomponent.com/knowledge/handle-recycling-attack/>, <https://comcomponent.com/knowledge/getlastpinvokeerror/>, <https://comcomponent.com/knowledge/blittable-type/>, <https://comcomponent.com/knowledge/delegate-callback-lifetime-management/>, <https://comcomponent.com/knowledge/unmanagedcallersonly/>, <https://comcomponent.com/knowledge/trimming/>, <https://comcomponent.com/knowledge/callback-pointer-gc-crash/>, <https://comcomponent.com/knowledge/bitness-match-requirement/>, <https://comcomponent.com/knowledge/com/> .

<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/blittable-type/> ;
    ks:requires <https://comcomponent.com/knowledge/bitness-match-requirement/> .

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

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

<https://comcomponent.com/knowledge/il-stub/> a skos:Concept ;
    skos:prefLabel "ILスタブ"@ja ;
    skos:definition "DllImportの呼び出しに対してランタイムが実行時に生成する、マーシャリング処理を含む中間コード。"@ja ;
    skos:altLabel "IL Stub" ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/native-aot/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/trimming/> .

<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/trimming/> a skos:Concept ;
    skos:prefLabel "trimming(トリミング)"@ja ;
    skos:definition "publish時に使われていないコードを削る.NETの機能。Native AOTではほぼ前提になる。"@ja ;
    skos:altLabel "Trimming" .

<https://comcomponent.com/knowledge/cswin32/> a skos:Concept ;
    skos:prefLabel "CsWin32"@ja ;
    skos:definition "公式のWin32メタデータから、呼びたい関数のP/Invokeシグネチャ・定数・構造体を自動生成するソースジェネレーター。"@ja ;
    skos:altLabel "Microsoft.Windows.CsWin32" ;
    ks:uses <https://comcomponent.com/knowledge/safehandle/> .

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

<https://comcomponent.com/knowledge/handle-recycling-attack/> a skos:Concept ;
    skos:prefLabel "ハンドルのリサイクル攻撃"@ja ;
    skos:definition "閉じたはずのハンドル値をWindowsが別のリソースへ再割り当てした状態で古いハンドル値を使い続け、無関係なリソースを操作してしまう事故。"@ja ;
    skos:altLabel "handle recycling" .

<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/getlastpinvokeerror/> a skos:Concept ;
    skos:prefLabel "Marshal.GetLastPInvokeError"@ja ;
    skos:definition "SetLastError=trueを付けたP/Invoke呼び出し直後に、スレッドローカルなWin32エラーコードを取得する.NET 6以降のAPI。"@ja ;
    skos:altLabel "GetLastPInvokeError" .

<https://comcomponent.com/knowledge/structlayout-pack/> a skos:Concept ;
    skos:prefLabel "StructLayoutAttribute.Pack"@ja ;
    skos:definition "P/Invokeでやり取りする構造体のフィールド配置(アラインメント)を制御する、StructLayoutAttributeのPackフィールド。"@ja ;
    skos:altLabel "Pack" ;
    skos:altLabel "構造体のパッキングサイズ"@ja .

<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/delegate-callback-lifetime-management/> a skos:Concept ;
    skos:prefLabel "コールバックデリゲートの寿命管理"@ja ;
    skos:definition "ネイティブ側に渡した関数ポインターに対応するデリゲートを、staticフィールドでの保持やGC.KeepAliveでGCに回収されないよう管理すること。"@ja ;
    skos:altLabel "GC.KeepAlive" ;
    skos:altLabel "static保持"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/callback-pointer-gc-crash/> .

<https://comcomponent.com/knowledge/callback-pointer-gc-crash/> a skos:Concept ;
    skos:prefLabel "関数ポインターのデリゲートがGCに回収されるクラッシュ"@ja ;
    skos:definition "GetFunctionPointerForDelegateで取得した関数ポインターとデリゲートの関連をGCが追跡しないため、ネイティブ側が使用中にデリゲートが回収されてクラッシュする事故。"@ja ;
    skos:altLabel "premature delegate collection" .

<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:recommendedFor <https://comcomponent.com/knowledge/callback-pointer-gc-crash/> .

<https://comcomponent.com/knowledge/bitness-match-requirement/> a skos:Concept ;
    skos:prefLabel "bitness一致要件"@ja ;
    skos:definition "ネイティブモジュール(in-procのCOMコンポーネント、P/Invokeで呼ぶDLL、ベンダー提供SDKのDLLなど)を読み込むホストプロセスと、そのモジュールのビット構成(32bit/64bit)が一致していなければならないという制約。"@ja ;
    skos:altLabel "32bit/64bitの一致"@ja ;
    skos:altLabel "bitness match" .

<https://comcomponent.com/knowledge/com/> a skos:Concept ;
    skos:prefLabel "COM(コンポーネントオブジェクトモデル)"@ja ;
    skos:definition "公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。"@ja ;
    skos:altLabel "Component Object Model" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/bitness-match-requirement/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libraryimport/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/dllimport/> ;
    schema:description ".NET 7で追加されたLibraryImportは、コンパイル時にマーシャリングコードを生成する新しい既定の選択肢としてDllImportの後継に当たる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dllimport/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/il-stub/> ;
    schema:description "DllImportは実行時にランタイムがマーシャリング用のILスタブを生成し、JITでコンパイルしてから呼び出しに使う"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/il-stub/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/native-aot/> ;
    schema:description "ILスタブは実行時のコード生成に依存するため、事前コンパイルを前提とするNative AOTには向かない。DllImport自体は対応済みのシグネチャなら使えるが、コンパイル時にマーシャリングコードを生成するLibraryImportのほうが適する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libraryimport/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/native-aot/> ;
    schema:description "LibraryImportはコンパイル時にマーシャリングコードを生成するため、Native AOTに対応するという本記事の推奨"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libraryimport/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/trimming/> ;
    schema:description "LibraryImportで生成されたコードは静的に解析できるため、未使用コードを削るトリミングと両立する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/il-stub/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/trimming/> ;
    schema:description "実行時に動的生成されるILスタブのコードはトリミングの静的解析で追跡できないため、トリミング前提の配置には向かない"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cswin32/> ;
    rdf:predicate ks:automates ;
    rdf:object <https://comcomponent.com/knowledge/dllimport/> ;
    schema:description "既定の設定で生成した場合、CsWin32はDllImportベースでP/Invokeシグネチャの記述を自動生成する。生成方式はNativeMethods.jsonの設定で変えられる"@ja ;
    ks:evidence <https://microsoft.github.io/CsWin32/docs/getting-started.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cswin32/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/native-aot/> ;
    schema:description "NativeMethods.jsonでallowMarshalingを無効にすると、ランタイムのマーシャラーに依存しないコード生成に切り替わりNative AOTを見据えた構成にできる"@ja ;
    ks:evidence <https://microsoft.github.io/CsWin32/docs/getting-started.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cswin32/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/safehandle/> ;
    schema:description "CsWin32はHANDLEを適切なSafeHandle派生型として出力する"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/winui/winui3/desktop-winui3-app-with-basic-interop> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/safehandle/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/p-invoke/> ;
    schema:description "ネイティブハンドルを生のIntPtrではなくSafeHandle派生クラスで持つことが、P/Invokeにおける.NETの基本作法として推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.safehandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/safehandle/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/handle-recycling-attack/> ;
    schema:description "SafeHandleは参照カウントの自動管理により、P/Invoke呼び出し中のハンドルの早期解放やリサイクルを防ぐ"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.safehandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/handle-recycling-attack/> ;
    schema:description "ハンドルを生のIntPtrで持つと、Windowsが積極的に再利用するハンドル値を介して無関係なリソースを操作してしまう事故が起こり得る"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.safehandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/libraryimport/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/stringmarshalling/> ;
    schema:description "LibraryImportはCharSetの代わりにStringMarshalling(Utf16/Utf8等)を明示する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation#differences-from-dllimport> ;
    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/getlastpinvokeerror/> ;
    schema:description "SetLastError=trueを明示的に付けたP/Invoke呼び出しでは、その失敗直後にMarshal.GetLastPInvokeErrorでWin32エラーコードを取得する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.marshal.getlastpinvokeerror> ;
    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-pack/> ;
    schema:description "構造体をP/Invokeでやり取りする場合に限り、StructLayoutAttributeでレイアウトを制御し、既定のPack=0が示すプラットフォーム既定パッキングサイズを意識する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.structlayoutattribute.pack> ;
    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/blittable-type/> ;
    schema:description "マネージドとアンマネージドでビット表現が同じブリッタブル型は変換なしにそのまま渡せ、P/Invokeで高速に扱える"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/best-practices#blittable-types> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/delegate-callback-lifetime-management/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/callback-pointer-gc-crash/> ;
    schema:description "デリゲートをstaticフィールドで保持するかGC.KeepAliveで生かすことで、ネイティブ側が使用中の関数ポインターに対応するデリゲートがGCに回収されるクラッシュを防ぐ"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/best-practices#prevent-delegate-collection-with-gckeepalive> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/callback-pointer-gc-crash/> ;
    schema:description "Marshal.GetFunctionPointerForDelegateで取得した関数ポインターとデリゲートの関連をGCは追跡しないため、寿命管理を怠るとクラッシュにつながる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/best-practices#prevent-delegate-collection-with-gckeepalive> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/unmanagedcallersonly/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/callback-pointer-gc-crash/> ;
    schema:description "delegate型よりUnmanagedCallersOnlyを付けた静的メソッドと関数ポインターを使うことが、オーバーヘッドの小さい代替として推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/best-practices#prevent-delegate-collection-with-gckeepalive> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/p-invoke/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/bitness-match-requirement/> ;
    schema:description "P/InvokeでDLLを呼び出すプロセスと対象DLLのビット構成(32bit/64bit)は一致している必要があり、異なるビット数のDLLは同一プロセスに共存できない"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/best-practices> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/com/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/bitness-match-requirement/> ;
    schema:description "同一プロセス内でのビット一致要件を越える必要がある場合、プロセスを分離しCOMのアウトプロセスサーバーで橋を架けるのが選択肢になる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/native-interop/best-practices> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
