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() { LogServerHelperHttp.SendNodeLog((int)LogNode.StartLoadGameDll); //ET.Log.Debug("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; var pdbPath = "Assets/Res/Code/Game.HotUpdate.pdb.bytes"; asset = GFGAsset.Load(pdbPath); byte[] pdbBytes = asset.bytes; if (LauncherConfig.ILRuntimeMode) { ILRuntimeLauncher.Instance.LoadAssembly(assBytes, pdbBytes); } else { StartCoroutine(LoadAssemblyJustInTime(assBytes, pdbBytes)); } GFGAsset.Release(dllPath); GFGAsset.Release(pdbPath); } IEnumerator LoadAssemblyJustInTime(byte[] assBytes, byte[] pdbBytes) { //mono模式 var assembly = Assembly.Load(assBytes, pdbBytes); this.allTypes = assembly.GetTypes(); System.Type type = assembly.GetType("GFGGame.HotUpdate.HotUpdateEntry"); type.GetMethod("Start").Invoke(type, null); yield break; } } }