使用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也有相应的动态加载技术。
下面是动态加载链接库的相应平台的头文件,具体相关信息,需要多多参阅其他资料,动态加载链接库将不提供详细介绍。
动态加载链接库之后,并需要获取mono链接库导出函数的API,把需要用到的函数指针都获取出来,最后使用mono的接口加载系统程序集。
在windows平台下,使用函数动态加载dll
获取导出函数的指针
当所有需要用到的函数都获取之后,我们进行系统程序集的加载,并且设置mono的状态。
当mono这一部分加载完毕之后,就可以自由使用mono与本地代码的绑定方式,即P/Invoke和Embedded。
在这里再加载非mono的第三方程序集,并测试下是否正常运行。新建一个C#工程,并指定Main方法入口,编译成exe
mono C++调用的大致代码如下:
如果上述代码能执行exe程序集指定的main方法,并成功输出,表证明mono运行是成功的。
下回将介绍脚本的绑定基本思想和绑定方式。
由于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运行是成功的。
下回将介绍脚本的绑定基本思想和绑定方式。
相关文章推荐
- 使用C#作为Cocos2dx引擎脚本语言进行游戏开发——C#脚本简介(一)
- 【COCOS2DX-LUA 脚本开发之一】LUA语言基础在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 转载一个简单的lua展示【COCOS2DX-LUA 脚本开发之一】LUA语言基础在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 【COCOS2DX-LUA 脚本开发之一】LUA语言基础在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)
- 看书笔记——《Unity3d脚本编程使用C#语言开发跨平台游戏》——U3d游戏脚本中的值类型
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- cocos2dx-lua 在cocos2d中使用lua脚本进行开发,并介绍脚本在游戏中的详细用途
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- Cocos2d-x-Lua 游戏中使用Lua脚本进行游戏开发
- 【COCOS2DX-LUA 脚本开发之十】使用Lua CJSON库进行encode与decode操作
- 【COCOS2DX-LUA 脚本开发之九】使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 【COCOS2DX-LUA 脚本开发之十】使用Lua CJSON库进行encode与decode操作完成对Json数据转化
- 使用Lua脚本进行游戏开发(基础篇)
- 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍