Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Универсальная платформа Windows: подключаемые модули для IL2CPP Scripting Backend

Модель подключаемого модуля для универсальной платформы WindowsФункция IAP, поддерживающая симулятор Microsoft In App Purchase, который позволяет тестировать IAP покупать потоки на устройствах перед публикацией приложения. Дополнительная информация
См. в Словарь
аналогичен другим платформам Unity (например, автономной версии Windows).

Управляемые плагины

По умолчанию IL2CPPразработанный Unity сервер сценариев, который можно использовать в качестве альтернативы Mono при создании проектов. для некоторых платформ. Подробнее
См. в Словарь
нацелен на уровень совместимости API .NET 2.0. Это означает, что он не поддерживает управляемые подключаемые модули, предназначенные для .NET 4.5 или использующие какие-либо API среды выполнения Windows. Все управляемые подключаемые модули должны быть ориентированы на .NET 4.5 или эквивалентный API при использовании этого уровня совместимости. Вы можете переключиться на уровень совместимости .NET 4.6 API в настройках Player, если хотите снять эти ограничения.

IL2CPP система сценариевСреда, обеспечивающая работу сценариев в Unity. Unity поддерживает три различных бэкэнда для сценариев в зависимости от целевой платформы: Mono, .NET и IL2CPP. Однако универсальная платформа Windows поддерживает только два: .NET и IL2CPP. Дополнительная информация
See in Словарь
предоставляет ту же поверхность .NET API, что и редактор Unity или автономный Player, поэтому можно использовать одни и те же подключаемые модули без необходимости компилировать отдельные версии, предназначенные для разных .NET API для универсальной платформы Windows.

Нативные плагины

Бэкэнд сценариев IL2CPP поддерживает использование собственных подключаемых модулей через механизм P/Invoke. Это означает, что вы можете вызывать собственные подключаемые модули непосредственно из кода C#, указав прототип собственной функции и затем вызвав его. Например:

[DllImport("MyPlugin.dll")] private static extern int CountLettersInString([MarshalAs(UnmanagedType.LPWSTR)]string str); private void Start() { Debug.Log(CountLettersInString("Hello, native plugin!")); }

Реализация такой функции внутри MyPlugin.dll будет выглядеть так:

extern "C" __declspec(dllexport) int __stdcall CountLettersInString(wchar_t* str) { int length = 0; while (*str++ != nullptr) length++; return length; }

Правила маршалинга P/Invoke соответствуют правилам официального маршалинга .NET, за исключением нескольких неподдерживаемых типов:

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

Соглашение по умолчанию для вызовов функций P/Invoke на платформе x86: __stdcall.

Собственные подключаемые модули можно создавать двумя способами: предварительно скомпилировать DLL или исходный код C++.

Предварительно скомпилированные нативные плагины

P/Вызов предварительно скомпилированных нативных подключаемых модулей работает путем загрузки библиотеки DLL во время выполнения, поиска точки входа в функцию и ее последующего вызова. Эти библиотеки DLL должны быть скомпилированы с использованием соответствующего Windows SDK для целевой архитектуры ЦП. Библиотеки DLL также должны быть настроены в плагине Inspectorокне Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. Дополнительная информация
См. в Словарь
при добавлении в проект Unity.

Нативные подключаемые модули исходного кода C++

Можно добавить файлы кода C++ (.cpp) непосредственно в проект Unity, который будет действовать как подключаемый модуль в инспекторе подключаемых модулей. Если они настроены для совместимости с универсальной платформой Windows и серверной частью сценариев IL2CPP, эти файлы C++ будут скомпилированы вместе с кодом C++, созданным из управляемых сборок:

Поскольку функции связаны друг с другом сгенерированным кодом C++, нет отдельной DLL для P/Invoke. В связи с этим можно использовать ключевое слово «__Internal» вместо имени DLL, что возлагает на C++ Linker ответственность за разрешение функций, а не загрузку их во время выполнения:

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

Поскольку вызов разрешается компоновщиком, ошибка в объявлении функции на управляемой стороне приведет к ошибке компоновщика, а не к ошибке во время выполнения. Это также означает, что во время выполнения не требуется динамической загрузки, а функция вызывается напрямую. Это значительно снижает накладные расходы на вызов P/Invoke.

Ограничения P/Invoke

На универсальной платформе Windows вы не можете P/Invoke в определенных системных библиотеках, указав имя dll (например, «kernelbase.dll») при использовании бэкенда сценариев IL2CPP. Попытка P/Invoke любой библиотеки DLL, существующей вне проекта, приведет к возникновению исключения DllNotFoundException во время выполнения.

Однако по-прежнему можно P/Invoke в эти системные функции, указав ключевое слово «**Internal» вместо имени DLL, что приводит к тому, что компоновщик разрешает функции во время сборки.

См. также

Plugin Inspector


  • Среда выполнения сценариев .NET 3.5 устарела в 2018.3
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3