首先第一个问题是java会提供一个虚拟机,然后c#的虚拟机在哪里呢?
众所周知的面试题,在clr runtime…What?公共语言运行时…这个烂名字….为什么起这个烂名字,因为微软避开”虚拟机”这个缓慢意思的词..
回到问题来,那么unity3d的它的跨平台服务的c#脚本虚拟机呢?
然后搜了一下,就很容易找到一个关键字”mono”,它可以让net嵌入到exe,一种跨平台的实现了..
具体看这篇文章 .NET和JAVA的跨平台,我们很期望,其实不容易
那么mono的教程….找了半天,发现没有什么教程…….
唯一可用的教程是这里:
https://blog.csdn.net/zouwei678/article/details/54908687
https://blog.csdn.net/zouwei678/article/details/54909403
但是他的例子有点过时, 我在win10下用vs2019, 用的是 mono-6.12.0.98-x64-0.msi
mono下载地址:http://www.mono-project.com/download/
64位安装完成后将在: C:Program FilesMono
32位安装完成后将在: C:Program Files x86)Mono
安装了之后设置环境
写一个 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); } } }
View Code
然后在这个文件的文件夹上面用power sell, 输入下面的,编译成DLL….路径可以先忽略
mcs Program.cs -t:library
二、根据下载的mono的版本,设置编译生成的目标位X64 或 X86
三、设置包含路径、库目录路径、附加依赖项
include:
C:Program FilesMonoincludemono-2.0
lib:
C:Program FilesMonolib
附加依赖项
mono-2.0.lib 原博客写的是这个,
mono-2.0-sgen.lib 但是我下载了的新版本是要这个
四、写C++代码,记得修改一下c#的dll路径..
// MonoDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #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 = "D:/MonoDemo/x64/Debug/Program.dll"; //获取应用域 domain = mono_jit_init"Test"); //加载程序集ManagedLibrary.dll MonoAssembly* assembly = mono_domain_assembly_opendomain, managed_binary_path); MonoImage* image = mono_assembly_get_imageassembly); // =====================================================准备调用 //获取MonoClass,类似于反射 MonoClass* main_class = mono_class_from_nameimage, "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_classentry_point_method_desc, main_class); mono_method_desc_freeentry_point_method_desc); //调用方法 mono_runtime_invokeentry_point_method, NULL, NULL, NULL); //释放应用域 mono_jit_cleanupdomain); return 0; }
View Code
五、运行会出现这样的报错
The assembly mscorlib.dll was not found or could not be loaded.
It should have been installed in the `D:MonoDemox64libmono4.5mscorlib.dll’ directory.
这个时候只需要 C:Program FilesMonolib 拷贝到 D:MonoDemo{你的工程}x64lib
一定要注意,{你的工程}的项目路径一定不能有中文,因为这个东西支持不好……