Экспорт функций
Руководство по экспорту функций из вашего плагина для использования другими языковыми модулями в Plugify.
В экосистеме Plugify плагины на C# могут экспортировать функции, чтобы сделать их доступными для других плагинов. Это руководство объясняет, как определять и экспортировать функции в C#, и предоставляет примеры, которые помогут вам беспрепятственно интегрировать ваши плагины.
Базовое сопоставление типов
В следующей таблице перечислены способы представления типов в C# API:
| Тип C++ | Тип C# | Псевдоним Plugify | Поддержка Ref? |
|---|---|---|---|
| void | void | void | ❌ |
| bool | Bool8 | bool | ✅ |
| char | Char8 | char8 | ✅ |
| char16_t | Char16 | char16 | ✅ |
| int8_t | sbyte | int8 | ✅ |
| int16_t | short | int16 | ✅ |
| int32_t | int | int32 | ✅ |
| int64_t | long | int64 | ✅ |
| uint8_t | byte | uint8 | ✅ |
| uint16_t | ushort | uint16 | ✅ |
| uint32_t | uint | uint32 | ✅ |
| uint64_t | ulong | uint64 | ✅ |
| uintptr_t | nint | ptr64 | ✅ |
| uintptr_t | nint | ptr32 | ✅ |
| float | float | float | ✅ |
| double | double | double | ✅ |
| void* | Delegate | function | ❌ |
| plg::string | string | string | ✅ |
| plg::any | object | any | ✅ |
| plg::vector<bool> | Bool8[] | bool[] | ✅ |
| plg::vector<char> | Char8[] | char8[] | ✅ |
| plg::vector<char16_t> | Char16[] | char16[] | ✅ |
| plg::vector<int8_t> | sbyte[] | int8[] | ✅ |
| plg::vector<int16_t> | short[] | int16[] | ✅ |
| plg::vector<int32_t> | int[] | int32[] | ✅ |
| plg::vector<int64_t> | long[] | int64[] | ✅ |
| plg::vector<uint8_t> | byte[] | uint8[] | ✅ |
| plg::vector<uint16_t> | ushort[] | uint16[] | ✅ |
| plg::vector<uint32_t> | uint[] | uint32[] | ✅ |
| plg::vector<uint64_t> | ulong[] | uint64[] | ✅ |
| plg::vector<uintptr_t> | nint[] | ptr64[] | ✅ |
| plg::vector<uintptr_t> | nint[] | ptr32[] | ✅ |
| plg::vector<float> | float[] | float[] | ✅ |
| plg::vector<double> | double[] | double[] | ✅ |
| plg::vector<plg::string> | string[] | string[] | ✅ |
| plg::vector<plg::any> | object[] | any[] | ✅ |
| plg::vector<plg::vec2> | Vector2[] | vec2[] | ✅ |
| plg::vector<plg::vec3> | Vector3[] | vec3[] | ✅ |
| plg::vector<plg::vec4> | Vector4[] | vec4[] | ✅ |
| plg::vector<plg::mat4x4> | Matrix4x4[] | mat4x4[] | ✅ |
| plg::vec2 | Vector2 | vec2 | ✅ |
| plg::vec3 | Vector3 | vec3 | ✅ |
| plg::vec4 | Vector4 | vec4 | ✅ |
| plg::mat4x4 | Matrix4x4 | mat4x4 | ✅ |
Экспорт функций в C#
Экспорт функций в C# прост, поскольку C# - это статически типизированный язык. Вам нужно определить функцию и указать ее в манифесте плагина. Языковой модуль C# в Plugify позаботится обо всем остальном.
Простой пример
Вот простой пример экспорта функции в плагине на C#:
Определение функции
Манифест плагина
Чтобы экспортировать функцию, опишите ее в манифесте плагина в разделе methods:
Сложный пример: Экспорт сложных функций
Вот пример экспорта функции со сложными типами параметров и возвращаемого значения:
Определение функции
Манифест плагина
Обработка обратных вызовов (Callbacks)
Plugify позволяет экспортировать функции, которые принимают обратные вызовы в качестве параметров. Вот пример:
Определение функции
Манифест плагина
Автоматизация генерации манифеста
Новое: Теперь вы можете автоматизировать генерацию раздела methods в манифесте вашего плагина с помощью генератора источников Roslyn - Plugify.Generator!
Вместо ручного написания JSON манифеста для каждой экспортируемой функции, вы можете использовать NuGet-пакет Plugify.Generator для автоматической генерации записей манифеста для функций, помеченных атрибутом [NativeExport].
Преимущества автоматической генерации
- Нет ручного написания JSON: Сигнатуры функций автоматически извлекаются из вашего кода
- Полная информация о типах: Типы параметров и возвращаемых значений автоматически сопоставляются
- Меньше ошибок: Устраняются опечатки и несоответствия типов между кодом и манифестом
- Простота обслуживания: Изменения в сигнатурах функций автоматически отражаются в манифесте
- Генерация во время сборки: Манифест генерируется во время компиляции, всегда оставаясь синхронизированным
Настройка: Установка Plugify.Generator
Добавьте NuGet-пакет Plugify.Generator в ваш проект плагина на C#:
Или добавьте его напрямую в ваш файл .csproj:
Пакет Plugify предоставляет атрибут [NativeExport], а Plugify.Generator - это генератор источников Roslyn, который обрабатывает эти атрибуты во время компиляции.
Использование атрибута NativeExport
Пометьте ваши экспортируемые функции атрибутом [NativeExport("ИмяФункции")]:
Как это работает
- Во время компиляции: Генератор источников Roslyn сканирует ваш код на наличие методов, помеченных
[NativeExport] - Сопоставление типов: Он автоматически сопоставляет типы C# с типами Plugify (например,
int→int32,string[]→string[]) - Генерация манифеста: JSON-файл, содержащий массив
methods, генерируется в выходных данных сборки - Интеграция: Скопируйте сгенерированные записи манифеста в ваш файл
.pplugin
Сгенерированный результат
При сборке вашего проекта генератор создает файл (например, ExampleCSharpPlugin.methods.json), содержащий:
Просто скопируйте этот массив в раздел methods вашего манифеста плагина.
Продвинутое использование: Работа с делегатами
Генератор также поддерживает типы делегатов для параметров обратного вызова:
Генератор автоматически создаст полную структуру прототипа функции:
Примечание: Генератор источников использует рефлексию и анализаторы Roslyn для извлечения информации о типах во время компиляции. Убедитесь, что ваши типы делегатов определены в той же сборке или в ссылочных сборках.
Лучшие практики
- Определяйте функции четко: Убедитесь, что ваши функции хорошо документированы и просты для понимания.
- Соблюдайте соглашения о типах: Придерживайтесь соглашений о типах Plugify для параметров и возвращаемых значений.
- Используйте XML-документацию: Добавляйте комментарии XML-документации (
/// <summary>,/// <param>,/// <returns>) для предоставления описаний в сгенерированном манифесте. - Используйте атрибут NativeExport: По возможности используйте атрибут
[NativeExport]с Plugify.Generator для автоматизации генерации манифеста. - Тестируйте тщательно: Тестируйте ваши экспортированные функции, чтобы убедиться, что они работают так, как ожидается, при вызове из других плагинов.
- Поддерживайте манифесты в актуальном состоянии: Если используете автоматическую генерацию, перегенерируйте манифест после внесения изменений в сигнатуры функций.
Заключение
Экспорт функций в плагинах на C# прост и понятен. Определяя свои функции и описывая их в манифесте плагина, вы можете создавать надежные и совместимые плагины. С новым генератором источников Roslyn - Plugify.Generator вы можете автоматизировать генерацию манифеста, просто помечая функции атрибутом [NativeExport], что снижает ручные усилия и поддерживает ваш манифест синхронизированным с кодом. Для более сложных случаев, таких как обработка обратных вызовов, используйте методы, описанные в этом руководстве.