Использование P/Invoke
P/Invoke — это технология, которая позволяет получать доступ к структурам, обратным вызовам и функциям в основном коде из управляемого кода. Конвенция вызова по умолчанию для функций P/Invoke на x86 — __stdcall. Дополнительные сведения см. в документации Microsoft по P/Invoke.
P/задействовать правила сортировки
Правила марширования P/Invoke такие же, как и для .NET марширования. Однако Unity не поддерживает следующие типы:
- AnsiBStr
- Валюта
- SAFEARRAY
- IDispatch
- TBStr
- VBByRefStr
Ограничения P/invoke
На универсальной платформе Windows (UWP) вы не можете указать имя библиотеки динамических ссылок (DLL) для P/Invoke в конкретные системные библиотеки. Если вы попытаетесь P/Invoke в любую DLL, которая существует вне проекта, это приведет к DllNotFoundException во время выполнения. Поэтому можно использовать ключевое слово __Internal вместо имени DLL, которое будет использовать линкер C++ для разрешения функций при сборке проекта, а не при загрузке их во время выполнения:
[DllImport("__Internal")]
private static extern int CountLettersInString([MarshalAs(UnmanagedType.LPWStr)]string str);
Если при объявлении функции в управляемом коде произойдет ошибка, это приведет к ошибке линкера, а не к ошибке во время выполнения. Это означает, что во время выполнения не требуется динамическая загрузка и функция вызывается напрямую, что снижает накладные расходы на вызов P/Invoke.
Дополнительные ресурсы
- Документация Microsoft по P/Invoke
- Авторские плагины UWP