Mono入门教程(一)--------------C++中整合Mono

前言

本教程是针对需要将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.dlllibmonosgen-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
Mono生成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#工程的窗口了!
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值