使用C#作为Cocos2dx引擎脚本语言进行游戏开发——脚本运行时基础(二)

来源:互联网 发布:android 网络监听 编辑:程序博客网 时间:2024/06/09 17:39

mono运行时(虚拟机)允许动态加载,这得益于windows系统和Android系统动态加载dll技术的成熟。在mono运行时成功加载之后,虚拟机将正常运行,允许加载mono的系统程序集(称C#的程序库为程序集),以及第三方的程序集,程序集加载之后,调用相应的C#代码即可正常使用。第三方的程序集,可以使用绑定mono运行时的代码,也可以使用P/Invoke的方式,并且mono可以回调C#的各个函数,我们可以自定义一个入口,或者使用程序集exe原来定义的Main方法为入口。

由于mono移植的平台很多,我们将使用第三方编译好的动态连接库进行开发(Genesis-3d有编译好的dll),参考Genesis3d的Mono绑定方式,结合mono官方API,整理一份MonoAPI的接口提供使用,届时提供资源下载。本文章大概说说mono运行时基本设置的知识,待资源整理完毕之后,将会整理一份完整的资料供参考。

建议大家先下载一个mono相关的sdk资源,本人使用的是3.2.3版本

http://www.mono-project.com/download/

主要是用mono提供的官方文档API做参考。

Mono-3.2.3\lib\monodoc\sources的monoapi.zip下,提供各个接口的API,并根据mono编译好的dll,获取导出函数,供逻辑调用。

运行时的加载:

在windows平台上,使用dll动态加载技术,将mono-2.0.dll加载(Android是so),并设置系统程序集目录,供运行时正常运行。Android也有相应的动态加载技术。

下面是动态加载链接库的相应平台的头文件,具体相关信息,需要多多参阅其他资料,动态加载链接库将不提供详细介绍。

#ifdef  WIN32#include "WinBase.h"static HMODULE s_monoDllHandle = NULL;#elif defined(ANDROID)#include "dlfcn.h"static void* s_monoSOHandle;#endif

动态加载链接库之后,并需要获取mono链接库导出函数的API,把需要用到的函数指针都获取出来,最后使用mono的接口加载系统程序集。

在windows平台下,使用函数动态加载dll

HMODULE hMonoModule = LoadLibraryW((wchar_t*)monoDllPath); 

Android平台下,使用void* hMonoModule = dlopen((char*)monoDllPath.c_str(), RTLD_LAZY);
如果返回指针是空,则表示平台热加载动态链接库失败。

获取导出函数的指针

//windows获得指定的导出函数的指针GetProcAddress(hMonoModule, #fun);//而Android获取导出函数指针。dlsym(hMonoModule, #fun);

当所有需要用到的函数都获取之后,我们进行系统程序集的加载,并且设置mono的状态。

mono_set_assemblies_path(monoAssemblyDirPaths.c_str());//设置系统程序集路径,集C#的默认库const char *version = "v2.0.50727";// - init monoMonoDomain* pDomain = mono_jit_init_version("MainMonoDomain", version);//判断mono版本库是否加载成功mono_assert(NULL != pDomain);

当mono这一部分加载完毕之后,就可以自由使用mono与本地代码的绑定方式,即P/Invoke和Embedded。

在这里再加载非mono的第三方程序集,并测试下是否正常运行。新建一个C#工程,并指定Main方法入口,编译成exe

class Test {    public static void Main(string[] args) {            Console.WriteLine("Test Mono!");    }}

mono C++调用的大致代码如下:

MonoAssembly* pMonoAssembly = mono_domain_assembly_open(pDomain, testExeAssPath);char* argv[] = { "", };mono_jit_exec (pDomain , pMonoAssembly , 1, argv);

如果上述代码能执行exe程序集指定的main方法,并成功输出,表证明mono运行是成功的。

下回将介绍脚本的绑定基本思想和绑定方式。

0 0
原创粉丝点击