1. 程式人生 > >ILRuntime熱更案例學習(一) ------ 自定義類庫/Helloworld案例

ILRuntime熱更案例學習(一) ------ 自定義類庫/Helloworld案例

官方示例下載地址1: https://github.com/Ourpalm/ILRuntime

官方示例下載地址2 : https://github.com/Ourpalm/ILRuntimeU3D

官方文件地址 : https://ourpalm.github.io/ILRuntime/public/v1/guide/tutorial.html


一.自定義類庫

1.開啟VS,建立新專案,如下所示

2. 生成類庫

生成成功後可看到dll位置 : 

 二.HelloWorld案例

這裡踩了一個小小的坑,官方文件跳轉的地址下載之後沒有dll工程,就是HotFix_Project,經U小白提醒才發現GitHub還有一個demo下載地址,上面都已經放出來了

那麼,要檢視dll工程,要引入帶黃色感嘆號的引用 :

 不過還是會報錯 :

這說的也很明顯,再引用UnityEngine.CoreModule.dll即可

修改了些註釋 :

using UnityEngine;
using System.Collections;
using System.IO;
using ILRuntime.Runtime.Enviorment;

public class HelloWorld : MonoBehaviour
{
    //AppDomain是ILRuntime的入口,最好是在一個單例類中儲存,整個遊戲全域性就一個
    //大家在正式專案中請全域性只建立一個AppDomain
    AppDomain appdomain;
    void Start()
    {
        //載入dll
        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("file:///" + Application.streamingAssetsPath + "/HotFix_Project.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("file:///" + Application.streamingAssetsPath + "/HotFix_Project.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))
            {
                //載入下載好的dll
                appdomain.LoadAssembly(fs, p, new Mono.Cecil.Pdb.PdbReaderProvider());
            }
        }

        InitializeILRuntime();
        OnHotFixLoaded();
    }

    void InitializeILRuntime()
    {
        //這裡做一些ILRuntime的註冊,HelloWorld示例暫時沒有需要註冊的
    }
    void OnHotFixLoaded()
    {
        //HelloWorld,第一次方法呼叫
        //HotFix_Project : 名稱空間 InstanceClass : 類名 StaticFunTest : 函式名
        appdomain.Invoke("HotFix_Project.InstanceClass", "StaticFunTest", null, null);

    }
}
  public static void StaticFunTest()
        {
            UnityEngine.Debug.Log("!!! InstanceClass.StaticFunTest()");
        }

執行後可以看到該函式被呼叫了 :