测试篇 学习Mono,跨平台c#(半成品)

首先第一个问题是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

 

  

一、新建c++工程并依赖,项目路径全英文!!!

  

二、根据下载的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_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;
}
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

一定要注意,{你的工程}的项目路径一定不能有中文,因为这个东西支持不好......

原文地址:https://www.cnblogs.com/JJBox/p/13886483.html