zoukankan      html  css  js  c++  java
  • 测试篇 学习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

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

  • 相关阅读:
    CentOS7下安装Scrapy
    阿里云ECS提示RHSA-2017:3263: curl security update
    CentOS 7.0安装配置LAMP服务器(Apache+PHP+MariaDB)
    Electron: 从零开始写一个记事本app
    flask请求流程
    编写Dockerfile
    docker-compose使用
    redis持久化切换rdb到aof
    RESTful API规范
    介绍importlib
  • 原文地址:https://www.cnblogs.com/JJBox/p/13886483.html
Copyright © 2011-2022 走看看