| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | using System;using System.Collections;using System.Reflection;using UnityEngine;using GFGGame.Launcher;namespace GFGGame{    public class HotUpdateCodeLoader : SingletonMonoBase<HotUpdateCodeLoader>    {        public Type[] allTypes;        public Type[] GetTypes()        {            return this.allTypes;        }        public void StartLoad()        {            StartCoroutine(StartLoadAssemblyHotfix());        }        IEnumerator StartLoadAssemblyHotfix()        {            LogServerHelperHttp.SendNodeLog((int)LogNode.StartLoadGameDll);            Debug.LogFormat("ILRuntimeLauncher StartLoadAssemblyHotfix");            yield return new WaitForSeconds(0.1f);            var dllPath = "Assets/Res/Code/Game.HotUpdate.dll.bytes";            var asset = GFGAsset.Load<TextAsset>(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<TextAsset>(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;        }    }}
 |