解决方案

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

seo靠我 2023-09-25 21:16:12

前言

本教程是针对需要将C#作为自己所开发的C++项目提供脚本的入门教程。由于mono教程相对较少,或缺乏完整性,故作此教程。虽然是教程,但是作者仍然是一个水平有限的程序员,因此文中如有纰漏请指正,我将SEO靠我尽力修改完善!!

开发环境搭建

操作系统:windows7

Mono版本:4.4

mono下载地址:http://www.mono-project.com/download/

下载后安装mono,安装过程略过。SEO靠我64位安装完成后将在:C:\Program Files\Mono找到生成Mono的Windows的运行时。32位可能会在C:\Program Files (x86)\Mono下

设置环境变量,将添加以下SEO靠我变量至Path路径下面:C:\Program Files\Mono\bin

创建VS工程并初始化—Mono,Hello World##

####一、新建工程并依赖

####二、根据下载的mono的版本,设置SEO靠我编译生成的目标位X64 或 X86

####三、设置包含路径、库目录路径、附加依赖项 include:

C:\Program Files\Mono\include\mono-2.0

lib

C:\ProgramSEO靠我 Files\Mono\lib

附加依赖项

mono-2.0.lib

####四、拷贝mono的运行dll到工作目录下面【关键步骤】

#####特别说明:由于mono运行时,bin中提供的mono-2.0.dSEO靠我ll并不完整,因此需要找到mono提供的完整的dll。同样还是在C:\Program Files\Mono\bin目录下面,有libmonoboehm-2.0.dlllibmonosgen-2.0.SEO靠我dll

这两个都可以,由于没有认真分析两个dll之间的差异,所以就没有深究了,复制其中一个到C++工作路径下面。并修改其名称为:mono-2.0.dll

####五、编写HelloMono,并通过MonSEO靠我o编译器生成dll,用于在C++中调用运行

Program.cs

using System; using System.Collections.Generic; usingSEO靠我 System.Linq; using System.Text; using System.Threading.Tasks;namespace MonoCsharp SEO靠我 {public static class MainTest{static void Main(){System.Console.WriteLine("你好,世界");System.ConSEO靠我sole.Read();}} }

在Window下运行cmd

命令提示符,并制定到上面源码所在位置:并输入Mono的命令:

###mcs Program.cs -t:library

(如果命令SEO靠我中提示:不是内部或外部命令,也不是可运行的程序),那么就检查下是否设置了环境变量

此时就会生成Program.cs所对应的C#dll

####最后一步,在C++中调用运行C#脚本

#include <monSEO靠我o/jit/jit.h> #include <mono/metadata/assembly.h> #include <mono/metadata/class.h> SEO靠我 #include <mono/metadata/debug-helpers.h> #include <mono/metadata/mono-config.h>MonoDomSEO靠我ain *domain;int main() {// Program.cs所编译dll所在的位置const char* managed_binary_path = "E:/2017/2SEO靠我/MonoRunTime/MonoRunTime/Program.dll";//获取应用域domain = mono_jit_init("Test");//加载程序集ManagedLibrary.dlSEO靠我lMonoAssembly* assembly = mono_domain_assembly_open(domain, managed_binary_path);MonoImage* image = SEO靠我mono_assembly_get_image(assembly);// =====================================================准备调用//获取MoSEO靠我noClass,类似于反射MonoClass* main_class = mono_class_from_name(image,"MonoCsharp", "MainTest");//获取要调用的MoSEO靠我noMethodDesc,主要调用过程MonoMethodDesc* entry_point_method_desc = mono_method_desc_new("MonoCsharp.MainTeSEO靠我st:Main()", true);MonoMethod* entry_point_method = mono_method_desc_search_in_class(entry_point_methSEO靠我od_desc, main_class);mono_method_desc_free(entry_point_method_desc);//调用方法mono_runtime_invoke(entry_SEO靠我point_method, NULL, NULL, NULL);//释放应用域mono_jit_cleanup(domain);return 0; }

如果不出意外:就会出现C#工程的窗SEO靠我口了!

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2