Version: 2022.2
言語: 日本語
ネイティブ UWP プラグインの作成
IL2CPP を使用した UWP アプリケーションのデバッグ

P/Invoke の使用

P/Invoke は、ネイティブコード内の構造体、コールバック、関数に、マネージコードからアクセスできるようにする技術です。x86 での P/Invoke 関数のデフォルトの呼び出し規則は __stdcall です。詳細は Microsoft の P/Invoke に関するドキュメント を参照してください。

P/invoke のマーシャリング規則

P/Invoke のマーシャリング規則は、.NET のマーシャリング 規則と同じです。ただし、Unity は以下の型をサポートしていません。

  • AnsiBStr
  • Currency
  • SAFEARRAY
  • IDispatch
  • TBStr
  • VBByRefStr

P/Invoke の制限

ユニバーサル Windows プラットフォーム (UWP) では、ダイナミックリンクライブラリ (DLL) 名を指定して特定のシステムライブラリ内に P/Invoke することはできません。プロジェクト外に存在する DLL に P/Invoke しようとすると、ランタイムに DllNotFoundException が発生します。そのため、DLL 名を使用する代わりに、(ランタイムでロードする代わりにプロジェクトのビルド時に C++ リンカーを使用して関数を解決する) __Internal キーワードを使用することが可能です。

    [DllImport("__Internal")]
        private static extern int CountLettersInString([MarshalAs(UnmanagedType.LPWStr)]string str);

マネージコード内での関数の宣言に間違いがあった場合、ランタイムにエラーが発生するのではなく、リンカーエラーが発生します。つまり、ランタイムに動的ローディングを行う必要がなく、関数が直接呼び出されるため、P/Invoke 呼び出しのオーバーヘッドが減少します。

その他の参考資料

ネイティブ UWP プラグインの作成
IL2CPP を使用した UWP アプリケーションのデバッグ