P/Invoke は、ネイティブコード内の構造体、コールバック、関数に、マネージコードからアクセスできるようにする技術です。x86 での P/Invoke 関数のデフォルトの呼び出し規則は __stdcall
です。詳細は Microsoft の P/Invoke に関するドキュメント を参照してください。
P/Invoke のマーシャリング規則は、.NET のマーシャリング 規則と同じです。ただし、Unity は以下の型をサポートしていません。
ユニバーサル 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 呼び出しのオーバーヘッドが減少します。