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;
- }
- }
- }
|