一、概述
Mono:
- Mono是一个由Xamarin公司所赞助的开源项目。Mono基于通用语言架构(CLI),提供了微软的dotNet的另一种实现。Mono具备跨平台能力。
- 将Mono运行时嵌入到C++游戏引擎程序中。可以实现脚本和引擎的分离。
托管代码
Mono运行时
C++程序
使用脚本语言优势:
- 代码方便维护,安全性高。
- 易于使用,开发效率高,适合快速开发。
C和C#交互方式:
- 内部调用(Internal Call):
把C代码暴露在CLI中。内部调用和运行时紧密集成,不支持在运行时类型和C类型之间进行Marshal。
- 原生C代码(Native C code):
???(见Mono文档)
- 平台调用(P/Invoke):
在.NET开发中最通用的方案。缺点是C++代码必须编译成DLL。
二、文档
http://docs.go-mono.com/?link=root:/embed
三、C++Mono运行环境配置
Mono安装:
-
有x86版本和x64版本。
-
配置环境变量。
Path:...\Mono\bin
创建C++项目:
-
包含目录:…\Mono\include\mono-2.0
-
库目录:…\Mono\lib
-
附加依赖项:mono-2.0-sgen.lib
四、Mono运行时和应用域的初始化
用Mono的编译器mcs编译:
编译源文件:
mcs Program.cs -t:library
编译有引用的源文件:
mcs -r:Program.dll TestScript.cs -t:library
在C++中创建Mono的应用域和运行时:
int main()
{
//------------------初始化Mono运行时------------------
// Program.cs所编译dll所在的位置
const char* path = "C:/Users/dell-pc/Desktop/Test/MonoC++Test/MonoCSharp/MonoCSharp/Program.dll";
//获取应用域
domain = mono_jit_init("Test");
//运行时配置 // 不设置则默认:(typically assemblies in /usr/lib/mono and configuration in /etc/mono)
//mono_set_dirs("C:/Program Files (x86)/Mono/lib", "C:/Program Files (x86)/Mono/etc");
//mono_config_parse(NULL);
//mono_domain_set_config(...);//Added in Mono 3.8.0. Used to fix ConfigurationErrorsException in #10468
//加载程序集
MonoAssembly* assembly = mono_domain_assembly_open(domain, path);
MonoImage* image = mono_assembly_get_image(assembly);
//-------------------------------------------------------
//???
//???
//-----------------释放应用域、结束------------------------
mono_jit_cleanup(domain);
return 0;
}