Как устроено нативное расширение
Библиотека, C-интерфейс, метаданные, регистрация и границы доступа.
ReckfellExtension — механизм подключения нативного кода через отдельную библиотеку и C-интерфейс. Расширение собирается отдельно от движка; для добавления библиотеки с доступным API пересборка самого движка не нужна.
Из чего оно состоит
| Часть | Назначение |
|---|---|
| DLL/so/dylib | Ваш скомпилированный нативный код для конкретной платформы |
| .reckfellextension | Точка входа, выбор библиотеки по тегам, ограничения версии и данные упаковки |
| reckfellextension_interface.h | C-типы и указатели на функции для взаимодействия с движком |
| reckfellextension_interface.json | Машиночитаемое описание того же низкоуровневого интерфейса |
| extension_api.json | Метаданные классов, методов, встроенных типов и размеров для привязок; это не просто список C-функций |
Языковая обёртка — дополнительный слой поверх этого контракта. Сам механизм не является языком программирования. C# Entity/Resource обычно используют управляемую интеграцию SDK; для них не нужно писать описание нативной библиотеки. При этом код C# может вызывать зарегистрированный нативный API через доступную интеграцию — утверждение, что эти системы «не связаны», вводит в заблуждение.
Путь загрузки
- Менеджер получает описание и выбирает библиотеку для активных признаков ОС/архитектуры.
- Загрузчик открывает её и находит экспортированный entry_symbol.
- Функция входа получает адрес resolver, указатель библиотеки и структуру инициализации. Нужные C-функции разрешаются по точным именам.
- Callback инициализации регистрирует классы/константы на подходящем уровне. В примерах это Scene, с базовым типом Entity.
- Код проекта использует зарегистрированное API. При завершении расширение снимает регистрации в callback деинициализации.
Для классов нужны корректные данные создания и жизненного цикла. Абстрактный класс из учебного примера намеренно нельзя инстанцировать; он доказывает регистрацию и передачу констант, а не готовность произвольного игрового компонента.
Где проходит граница
Использование C/C++ не открывает автоматически приватные классы и функции Source. Если нужной операции нет в интерфейсе или доступном API, потребуется другая точка расширения либо изменение/модуль движка с отдельной сборкой.
Номер продукта, архитектура, точность встроенных чисел, заголовок и метаданные должны быть согласованы. Проверяйте наличие разрешаемых функций и реальную работу нужного метода; сохранённое в SDK имя может оказаться заглушкой. Текущий пример и ограничения относятся к установленной сборке, а не к обещанию всех будущих версий.
Не смешивайте владение объектами, временное представление Variant и непрозрачные handles. Контракт конкретной функции определяет, кто создаёт и уничтожает данные; простое копирование байтов объекта не переносит его состояние и срок жизни в другой процесс.
Что делать дальше
Пример C17 даёт полный маленький проект проверки ABI. Описание библиотеки объясняет выбор бинарника и ошибки загрузки. Метаданные интерфейса нужны при разработке собственной привязки.