P/Invoke の使用
Learn the rules and limitations of using P/invoke.
読み終わるまでの所要時間 3 分最終更新 1ヶ月前
P/Invoke は、マネージコードからネイティブコードの構造体、コールバック、および関数にアクセスできる技術です。x86 での P/Invoke 関数用デフォルトの呼び出し規則は、 です。詳細は、[P/Invoke] についての Microsoft のドキュメント (https://learn.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke) を参照してください。
__stdcallP/invoke マーシャリングのルール
P/Invoke マーシャリングのルールは、.NET マーシャリングのルールと同じです。ただし、Unity では以下のタイプはサポートされません。
- AnsiBStr
- Currency
- SAFEARRAY
- IDispatch
- TBStr
- VBByRefStr
P/Invoke の制限
ユニバーサル Windows プラットフォーム (UWP) では、特定のシステムライブラリへの P/Invoke に動的リンクライブラリ (DLL) 名を指定することはできません。プロジェクトの外部に存在する DLL に P/Invoke を行なおうとすると、ランタイムに DllNotFoundException が発生します。したがって、DLL 名の代わりに キーワードを使用することで、ランタイムのロード時ではなく、プロジェクトのビルド時に C++ リンカーを使用して関数を解決できます。
__Internal[DllImport("__Internal")] private static extern int CountLettersInString([MarshalAs(UnmanagedType.LPWStr)]string str);
マネージコードで関数の宣言時にエラーが発生すると、ランタイムのエラーではなく、リンカーのエラーが発生します。つまり、ランタイムに動的ロードを行う必要はなく、関数が直接呼び出されるため、P/Invoke 呼び出しのオーバーヘッドが軽減されます。