Запуск кода С# из приложения С++ (Android NDK) бесплатно

У меня есть движок игры на С++, который в настоящее время поддерживает Windows, Linux и Android (NDK). Он построен поверх SDL и использует OpenGL для рендеринга.

Одним из конструктивных ограничений этого игрового движка является то, что стоимость разработки должна составлять 0,00 долл. - создание механизма должно быть бесплатным для меня (кроме часов человека), мне должно быть разрешено свободно распространять код двигателя и двоичные файлы, и пользователи должны иметь возможность продавать игры, созданные с помощью движка без ограничений.

В настоящее время я использую очень медленный интерпретируемый язык сценариев для логики игры - он действительно хорошо работает для написания кода клея и простых ответов на события пользовательского интерфейса, но не намного больше.

Я хочу заменить эту систему на решение С# - попросите пользователя скомпилировать библиотеку классов С# (DLL), содержащую их логику игры, и чтобы сторона С++ "потребляла" эту DLL и вызывала соответствующие перехватчики.

Было довольно сложно найти информацию о том, как достичь этого кросс-платформенным способом. На каждой платформе есть другой способ размещения необходимых промежутков времени. Кроме того, большинство статей, которые я нашел, предполагают использование полнофункциональных фреймворков, которые обеспечивают абстракции платформы, которые уже реализованы в моем движке.

Есть ли в настоящее время способ запускать код из С# DLL из приложения на базе С++ на базе Android NDK без использования совершенно другого SDK и без необходимости выкладывать сотни долларов за лицензию?

В частности, я смотрю некоторые недавние инициативы Microsoft с открытым исходным кодом в Microsoft. Что-нибудь там я мог бы использовать?

EDIT: Чтобы уточнить, Windows и Linux имеют хорошо документированные способы запуска .net-кода "бесплатно" - этот вопрос относится конкретно к вызову управляемого кода из приложения Android NDK БЕЗ оплаты лицензий Xamarin или другому вендору.

Ответы

Ответ 1

Простой ответ: нет, то, что вы ищете, в настоящее время не существует. Вам нужно будет отказаться/изменить требования, чтобы найти решение.

Ближайший, о котором я знаю, dot42 - который, похоже, поддерживает некоторые из .net на android, недавно был включен в github и закрытие главного сайта - но в основном репозитории компилятора нет упоминания о лицензии (я добавил ошибку, чтобы получить это обновление..)

Непонятно, что он поддерживает динамическую загрузку С#.dll, хотя и претендует на компиляцию в DEX. (Но это может быть бесплатным, в зависимости от того, что разработчики выпускают как лицензию...)

Xamarin - единственная возможная альтернатива, о которой я знаю, но поскольку вы знаете, что только стартерное издание бесплатное.

Если то, что вам нужно, это просто лучшая поддержка скриптов, я бы сбросил скомпилированные и требования к С# и нашел то, что уже хорошо работает на андроиде. Lua - это мое решение для такого рода вещей, но я не использовал его на андроиде раньше... и многие другие варианты существуют.

Ответ 2

Было довольно сложно найти информацию о том, как достичь этого кросс-платформенным способом...

Я собираюсь решить проблему "писать один раз, бегать везде".

Я создаю и поддерживаю библиотеку, состоящую из одного набора источников, который работает в Windows, Linux, OS X, Windows Phone, Android и iOS. Для этого мне пришлось писать все в переносном C/С++, а затем создавать библиотеки DLL или общие объекты.

В проекте используется .Net-взаимодействие для вызова в DLL, а Android использует JNI для вызова общего объекта. На iOS создается статическая библиотека, а не общий объект.

В DLL или совместно используемом объекте определен определенный тип платформы. Например, он должен знать, как получить случайные числа из базовой ОС. Таким образом, он будет иметь такую ​​функцию, как:

bool GetRandomNumbers(unsigned char* ptr, size_t size)
{
#if defined(WIN32) || defined(WIN64)
   ...
#elif defined(__linux___) || defined(linux)
   ...
#elif defined(__ANDROID___)
   ...
#endif
}

Итак, держите свою основную бизнес-логику переносимой и в DLL или совместно используемом объекте, #define, где вы должны абстрагировать различия в платформе, и все будет в порядке.

В дополнение к переносимой библиотеке вы накладываете материал GUI на платформу.

Если вы попытаетесь записать это на С#, а затем использовать его на других платформах, вы просто будете создавать проблемы. Единственный способ сделать переносимость с помощью одного набора источников - использовать переносимый C/С++.

Я также видел, как ребята реорганизованы на каждом языке: C и Win32 для Windows,.NET для Windows, C для Linux, Cocoa для OS X,.Net для Windows Phone, Java для Android и CocoaTouch для IOS. Это создает около 6 раз работу, и поведение никогда не бывает одинаковым на разных платформах.

Ответ 3

Популярным движком script для игр является Lua; вы можете подумать об использовании этого, так как это тривиально легко связать с C/С++. Если вы используете LuaJIT, он также быстро вспыхивает на Android (и не потертый на iOS).

Можно подумать, что если вы создадите свой собственный движок поверх Cocos2d-X, вы получите не только Lua (или JavaScript) бесплатно как подключенный скриптовый движок, вы также сможете переносить на Windows (Win32 и Windows 8.1 Universal), iOS, Mac и Linux, среду IDE (!!) и огромное сообщество поддержки.

Или вы можете потратить много времени на выяснение того, как интегрировать С# в ваш движок.