ILRunTime

關於ILRunTime的介紹,詳細的可參考 官方中文文檔地址:https://ourpalm.github.io/ILRuntime/public/v1/guide/index.html

ILRuntime的優勢

同市面上的其他熱更方案相比,ILRuntime主要有以下優點:

  • 無縫訪問C#工程的現成代碼,無需額外抽象腳本API
  • 直接使用VS2015進行開發,ILRuntime的解譯引擎支持.Net 4.6編譯的DLL
  • 執行效率是L#的10-20倍
  • 選擇性的CLR綁定使跨域調用更快速,綁定後跨域調用的性能能達到slua的2倍左右(從腳本調用GameObject之類的接口)
  • 支持跨域繼承
  • 完整的泛型支持
  • 擁有Visual Studio的調試插件,可以實現真機源碼級調試。支持Visual Studio 2015 Update3 以及Visual Studio 2017

ILRunTime資源

官方Github地址:https://github.com/Ourpalm/ILRuntime

Unity Demo 地址:https://github.com/Ourpalm/ILRuntimeU3D/

對項目中運用UnityDemo就可以

 

 

在剛開始使用的時候,會有部分的坑,解決辦法在這個大佬的文章中有介紹

https://blog.csdn.net/u010294054/article/details/90724454

首先將需要導入的資源,導入到項目中,並配置環境

 

 

 

ILRunTime   HelloWorld  實例應用

示例一:

創建如圖文件夾,

creat -----assembly definition

Assembly Definition 自己可以完成程序集的定義,從而將一個大型的或腳本過多的項目很好的規範起來

創建腳本

注意:  腳本的必須定義命名空間,腳本不能繼承自 MonoBehavior

 

找到生成的 .dll和.pdb文件

將其放入文件夾裏邊(自己創建的文件夾)

然後在IlManager.cs中實現熱更新的調用

public class HelloWorld : MonoBehaviour
{
    //AppDomain是ILRuntime的入口,最好是在一個單例類中保存,整個遊戲全局就一個,這裏爲了示例方便,每個例子裏面都單獨做了一個
    //大家在正式項目中請全局只創建一個AppDomain
    AppDomain appdomain;

    void Start()
    {
        StartCoroutine(LoadHotFixAssembly());
    }

    IEnumerator LoadHotFixAssembly()
    {
        //首先實例化ILRuntime的AppDomain,AppDomain是一個應用程序域,每個AppDomain都是一個獨立的沙盒
        appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();
        //正常項目中應該是自行從其他地方下載dll,或者打包在AssetBundle中讀取,平時開發以及爲了演示方便直接從StreammingAssets中讀取,
        //正式發佈的時候需要大家自行從其他地方讀取dll

        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        //這個DLL文件是直接編譯HotFix_Project.sln生成的,已經在項目中設置好輸出目錄爲StreamingAssets,在VS裏直接編譯即可生成到對應目錄,無需手動拷貝
#if UNITY_ANDROID
       // WWW www = new WWW(Application.streamingAssetsPath + "/HotFix_Project.dll");
#else
        WWW www = new WWW(@"E:\\UnityMF\Unity熱更新\AssetBundleProject\IlRunTimeTest\HorFix\IL.dll");
#endif
        while (!www.isDone)
            yield return null;
        if (!string.IsNullOrEmpty(www.error))
            UnityEngine.Debug.LogError(www.error);
        byte[] dll = www.bytes;
        www.Dispose();

        //PDB文件是調試數據庫,如需要在日誌中顯示報錯的行號,則必須提供PDB文件,不過由於會額外耗用內存,正式發佈時請將PDB去掉,下面LoadAssembly的時候pdb傳null即可
#if UNITY_ANDROID
        www = new WWW(Application.streamingAssetsPath + "/HotFix_Project.pdb");
#else
        www = new WWW(@"E:\\UnityMF\Unity熱更新\AssetBundleProject\IlRunTimeTest\HorFix\IL.pdb");
#endif
        while (!www.isDone)
            yield return null;
        if (!string.IsNullOrEmpty(www.error))
            UnityEngine.Debug.LogError(www.error);
        byte[] pdb = www.bytes;
        using (System.IO.MemoryStream fs = new MemoryStream(dll))
        {
            using (System.IO.MemoryStream p = new MemoryStream(pdb))
            {
                appdomain.LoadAssembly(fs, p, new Mono.Cecil.Pdb.PdbReaderProvider());
            }
        }

        InitializeILRuntime();
        OnHotFixLoaded();
    }

    void InitializeILRuntime()
    {
        //這裏做一些ILRuntime的註冊,HelloWorld示例暫時沒有需要註冊的
    }

    void OnHotFixLoaded()
    {
        //HelloWorld,第一次方法調用
        appdomain.Invoke("IL.Test","Init",null,null);

    }

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章