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