關於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);
}