ILRuntime熱更案例學習(一) ------ 自定義類庫/Helloworld案例
阿新 • • 發佈:2018-12-12
官方示例下載地址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()");
}
執行後可以看到該函式被呼叫了 :