kiw*_*nga 15 .net c# c++ android-ndk
我有一个C++游戏引擎,目前支持Windows,Linux和Android(NDK).它建立在SDL之上,使用OpenGL进行渲染.
这个游戏引擎的一个设计限制是开发成本必须是0.00美元 - 构建引擎应该免费给我(除了工时),我必须被允许自由地重新分配引擎的代码和二进制文件,并且用户应该能够无限制地销售使用引擎创建的游戏.
现在,我正在使用一种非常缓慢的解释脚本语言来实现游戏逻辑 - 它实际上适用于编写粘合代码和简单的UI事件响应,但不是很多.
我想用C#解决方案替换这个系统 - 让用户编译一个包含他们的游戏逻辑的C#类库(DLL),并让C++端'使用'这个DLL并调用适当的钩子.
很难找到有关如何以跨平台方式实现这一目标的信息.每个平台都有不同的方式来托管所需的运行时.此外,我发现的大多数文章都建议使用完整的框架来提供已在我的引擎中实现的平台抽象.
目前有一种方法可以从基于Android NDK的C++应用程序中运行C#DLL中的代码,而无需使用完全不同的SDK,而且无需为许可证支付数百美元的费用吗?
特别是,我正在关注微软近期的一些开源.net计划 - 我可以使用哪些东西?
编辑:为了澄清,Windows和Linux有充分记录的运行.net代码'免费'的方法 - 这个问题专门涉及从Android NDK应用程序调用托管代码而不向Xamarin或其他供应商支付许可费.
找到有关如何以跨平台方式实现这一目标的信息相当困难......
我只想解决“一次编写,到处运行”的问题。
我构建并维护一个由一组源代码组成的库,可在 Windows、Linux、OS X、Windows Phone、Android 和 iOS 上运行。为此,我必须用可移植的 C/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
}
Run Code Online (Sandbox Code Playgroud)
因此,保持核心业务逻辑可移植并位于 DLL 或共享对象中,#define您必须在其中抽象平台差异,这样就可以了。
在可移植库之上,您可以对平台特定的 GUI 内容进行分层。
如果您尝试用 C# 编写此代码,然后在其他平台上使用它,那么您只会给自己带来问题。使用一组源实现可移植性的唯一方法是使用可移植的 C/C++。
我还看到人们用各种语言重新实现:用于 Windows 的 C 和 Win32、用于 Windows 的 .Net、用于 Linux 的 C、用于 OS X 的 Cocoa、用于 Windows Phone 的 .Net、用于 Android 的 Java 和用于 iOS 的 CocoaTouch。这会产生大约 6 倍的工作量,而且跨平台的行为永远不会完全相同。