您的位置:首页 > 移动开发 > Cocos引擎

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

2014-12-17 18:35 836 查看
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 mono
MonoDomain* 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运行是成功的。

下回将介绍脚本的绑定基本思想和绑定方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐