using System; using System.Collections; using System.Reflection; using UnityEngine; using GFGGame.Launcher; namespace GFGGame { public class HotUpdateCodeLoader : SingletonMonoBase { public Type[] allTypes; public Type[] GetTypes() { return this.allTypes; } public void StartLoad() { StartCoroutine(StartLoadAssemblyHotfix()); } IEnumerator StartLoadAssemblyHotfix() { Debug.LogFormat("ILRuntimeLauncher StartLoadAssemblyHotfix"); yield return new WaitForSeconds(0.1f); var dllPath = "Assets/Res/Code/Game.HotUpdate.dll.bytes"; var asset = GFGAsset.Load(dllPath); byte[] assBytes = asset.bytes; //Debug.LogFormat("assBytes != null {0}", assBytes != null); //Debug.LogFormat("assBytes.Length {0}", assBytes.Length); //yield return new WaitForSeconds(0.1f); var pdbPath = "Assets/Res/Code/Game.HotUpdate.pdb.bytes"; asset = GFGAsset.Load(pdbPath); byte[] pdbBytes = asset.bytes; //Debug.LogFormat("pdbBytes != null {0}", pdbBytes != null); //Debug.LogFormat("pdbBytes.Length {0}", pdbBytes.Length); if (LauncherConfig.ILRuntimeMode) { Debug.LogFormat("Assembly Mode ILRuntime"); ILRuntimeLauncher.Instance.LoadAssembly(assBytes, pdbBytes); } else { Debug.LogFormat("Assembly Mode Jit"); StartCoroutine(LoadAssemblyJustInTime(assBytes, pdbBytes)); } GFGAsset.Release(dllPath); GFGAsset.Release(pdbPath); } IEnumerator LoadAssemblyJustInTime(byte[] assBytes, byte[] pdbBytes) { //yield return new WaitForSeconds(0.1f); //mono模式 var assembly = Assembly.Load(assBytes, pdbBytes); this.allTypes = assembly.GetTypes(); //Debug.LogFormat("assembly != null {0}", assembly != null); //yield return new WaitForSeconds(0.1f); System.Type type = assembly.GetType("GFGGame.HotUpdate.HotUpdateEntry"); //Debug.LogFormat("type != null {0}", type != null); //yield return new WaitForSeconds(0.1f); type.GetMethod("Start").Invoke(type, null); yield break; } } }