我有一个C++游戏引擎,当前支持Windows,Linux和Android(NDK)。它基于SDL构建,并使用OpenGL进行渲染。

此游戏引擎的设计约束之一是开发成本必须为0.00美元- build 该引擎对我来说不会产生任何费用(工时除外),必须允许我自由地重新分发该引擎的代码和二进制文件,并且用户应该能够不受限制地出售使用该引擎创建的游戏。

现在,我正在使用一种非常慢的解释性脚本语言来实现游戏逻辑-实际上,它对于编写胶水代码和对UI事件的简单响应非常有效,但其他方面还很少。

我想用C#解决方案替换该系统-让用户编译包含其游戏逻辑的C#类库(DLL),并让C++端“消费”该DLL并调用适当的钩子(Hook)。

很难找到有关如何以跨平台方式实现此目标的信息。每个平台都有不同的方式托管所需的运行时。另外,我发现的大多数文章都建议使用成熟的框架,这些框架提供了已经在我的引擎中实现的平台抽象。

当前是否有一种方法可以从基于Android NDK的C++应用程序的C#DLL中运行代码,而无需使用完全不同的SDK,也不必花数百美元来获得许可证?

特别是,我正在关注Microsoft最近的一些开源.net计划-有什么我可以使用的?

编辑:为澄清起见,Windows和Linux具有文件化的“免费”运行.net代码的方式-这个问题专门涉及从Android NDK应用程序调用托管代码而无需向Xamarin或其他供应商支付许可费。

最佳答案



我将只解决“一次编写,随处运行”的问题。

我构建并维护一个由一组资源组成的库,该库可在Windows,Linux,OS X,Windows Phone,Android和iOS上运行。为此,我必须用可移植的C/C++编写所有内容,然后构建DLL或共享对象。

该项目使用.Net interop调用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/C++。

我还看到人们以每种语言重新实现:Windows的C和Win32,Windows的.Net,Linux的C,OS X的Cocoa,Windows Phone的.Net,Android的Java和iOS的CocoaTouch。这创造了大约6倍的工作量,并且在各个平台上的行为永远都不会完全相同。

关于c# - 免费从C++应用程序(Android NDK)运行C#代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30686330/

10-10 23:19
查看更多