前言
本教程是针对需要将C#作为自己所开发的C++项目提供脚本的入门教程。由于mono教程相对较少,或缺乏完整性,故作此教程。虽然是教程,但是作者仍然是一个水平有限的程序员,因此文中如有纰漏请指正,我将尽力修改完善!!
开发环境搭建
操作系统:windows7
Mono版本:4.4
mono下载地址:http://www.mono-project.com/download/
下载后安装mono,安装过程略过。64位安装完成后将在:C:\Program Files\Mono找到生成Mono的Windows的运行时。32位可能会在C:\Program Files (x86)\Mono下
设置环境变量,将添加以下变量至Path路径下面:C:\Program Files\Mono\bin
创建VS工程并初始化—Mono,Hello World##
####一、新建工程并依赖
####二、根据下载的mono的版本,设置编译生成的目标位X64 或 X86
####三、设置包含路径、库目录路径、附加依赖项
include:
C:\Program Files\Mono\include\mono-2.0
lib
C:\Program Files\Mono\lib
附加依赖项
mono-2.0.lib
####四、拷贝mono的运行dll到工作目录下面【关键步骤】
#####特别说明:由于mono运行时,bin中提供的mono-2.0.dll并不完整,因此需要找到mono提供的完整的dll。同样还是在C:\Program Files\Mono\bin目录下面,有libmonoboehm-2.0.dll、libmonosgen-2.0.dll。
这两个都可以,由于没有认真分析两个dll之间的差异,所以就没有深究了,复制其中一个到C++工作路径下面。并修改其名称为:mono-2.0.dll
####五、编写HelloMono,并通过Mono编译器生成dll,用于在C++中调用运行
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MonoCsharp
{
public static class MainTest
{
static void Main()
{
System.Console.WriteLine("你好,世界");
System.Console.Read();
}
}
}
在Window下运行cmd命令提示符,并制定到上面源码所在位置:并输入Mono的命令:
###mcs Program.cs -t:library
(如果命令中提示:不是内部或外部命令,也不是可运行的程序),那么就检查下是否设置了环境变量
此时就会生成Program.cs所对应的C#dll
####最后一步,在C++中调用运行C#脚本
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/class.h>
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/mono-config.h>
MonoDomain *domain;
int main()
{
// Program.cs所编译dll所在的位置
const char* managed_binary_path = "E:/2017/2/MonoRunTime/MonoRunTime/Program.dll";
//获取应用域
domain = mono_jit_init("Test");
//加载程序集ManagedLibrary.dll
MonoAssembly* assembly = mono_domain_assembly_open(domain, managed_binary_path);
MonoImage* image = mono_assembly_get_image(assembly);
// =====================================================准备调用
//获取MonoClass,类似于反射
MonoClass* main_class = mono_class_from_name(image,"MonoCsharp", "MainTest");
//获取要调用的MonoMethodDesc,主要调用过程
MonoMethodDesc* entry_point_method_desc = mono_method_desc_new("MonoCsharp.MainTest:Main()", true);
MonoMethod* entry_point_method = mono_method_desc_search_in_class(entry_point_method_desc, main_class);
mono_method_desc_free(entry_point_method_desc);
//调用方法
mono_runtime_invoke(entry_point_method, NULL, NULL, NULL);
//释放应用域
mono_jit_cleanup(domain);
return 0;
}
如果不出意外:就会出现C#工程的窗口了!