測試篇 學習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 Files\Mono

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 Files\Mono\include\mono-2.0
lib:
C:\Program Files\Mono\lib

  

  

附加依賴項

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:\MonoDemo\x64\lib\mono\4.5\mscorlib.dll' directory.

這個時候只需要 C:\Program Files\Mono\lib 拷貝到 D:\MonoDemo{你的工程}\x64\lib

一定要注意,{你的工程}的項目路徑一定不能有中文,因為這個東西支持不好......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM