static void OnUpdateFinish(bool succeed) { //更新失败 if (!succeed) { return; } TempUIMgr.Instance.Reset(); HotFixHelper.LoadHotfixAssembly(UpdaterManager.Instance.CodeData); AppFacade tmpAppFacade = AppFacade.Instance; IStaticMethod tmpInitMethod = null; #if ILRuntime tmpInitMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, INIT_METHOD_NAME, 0); tmpAppFacade.UpdateMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, UPDATE_METHOD_NAME, 0); tmpAppFacade.LateUpdateMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, LATE_UPDATE_METHOD_NAME, 0); tmpAppFacade.FixedUpdateMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, FIXED_UPDATE_METHOD_NAME, 0); tmpAppFacade.CloseMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, CLOSE_METHOD_NAME, 0); tmpAppFacade.ApplicationQuitMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, APPLICATION_QUIT_METHOD_NAME, 0); #else Type tmpType = HotFixHelper.HotFixAssembly.GetType(ENTRY_CLASS_NAME); tmpInitMethod = new MonoStaticMethod(tmpType, INIT_METHOD_NAME); tmpAppFacade.UpdateMethod = new MonoStaticMethod(tmpType, UPDATE_METHOD_NAME); tmpAppFacade.LateUpdateMethod = new MonoStaticMethod(tmpType, LATE_UPDATE_METHOD_NAME); tmpAppFacade.FixedUpdateMethod = new MonoStaticMethod(tmpType, FIXED_UPDATE_METHOD_NAME); tmpAppFacade.CloseMethod = new MonoStaticMethod(tmpType, CLOSE_METHOD_NAME); tmpAppFacade.ApplicationQuitMethod = new MonoStaticMethod(tmpType, APPLICATION_QUIT_METHOD_NAME); #endif tmpInitMethod.Run(); }
// 初始化热更程序 private void InitHotfixProgram() { string typeName = "Hotfix.Main"; string startFunName = "Start"; string updateFunName = "Update"; string lateUpdateFunName = "LateUpdate"; string uiLanguageFunName = "UILanguage"; if (_isEnableILRuntime) { ILRRegister.Register(ILRDomain); _startFun = new ILRStaticMethod(ILRDomain, typeName, startFunName, 0); _updateFun = new ILRStaticMethod(ILRDomain, typeName, updateFunName, 0); _lateUpdateFun = new ILRStaticMethod(ILRDomain, typeName, lateUpdateFunName, 0); _uiLanguageFun = new ILRStaticMethod(ILRDomain, typeName, uiLanguageFunName, 1); HotfixAssemblyTypes = ILRDomain.LoadedTypes.Values.Select(x => x.ReflectionType).ToList(); } else { Type type = _monoAssembly.GetType(typeName); _startFun = new MonoStaticMethod(type, startFunName); _updateFun = new MonoStaticMethod(type, updateFunName); _lateUpdateFun = new MonoStaticMethod(type, lateUpdateFunName); _uiLanguageFun = new MonoStaticMethod(type, uiLanguageFunName); HotfixAssemblyTypes = _monoAssembly.GetTypes().ToList <Type>(); } }
private void RegistMethod() { UpdateMethod = AppAssembly.GetStaticMethod("HotfixApp", "Update", 0); LateUpdateMethod = AppAssembly.GetStaticMethod("HotfixApp", "LateUpdate", 0); FixedUpdateMethod = AppAssembly.GetStaticMethod("HotfixApp", "FixedUpdate", 0); OnApplicationQuitMethod = AppAssembly.GetStaticMethod("HotfixApp", "OnApplicationQuit", 0); OnApplicationFocusMethod = AppAssembly.GetStaticMethod("HotfixApp", "OnApplicationFocus", 1); OnApplicationPauseMethod = AppAssembly.GetStaticMethod("HotfixApp", "OnApplicationPause", 1); var initFunc = AppAssembly.GetStaticMethod("HotfixApp", "Init", 0); initFunc?.Run(); if (initFunc == null) { Debug.LogError("HotfixApp 缺少 Init,Hotfix 模块的功能可能无法启用"); } }
void LoadHotFixAssembly(byte[] data) { HotFixHelper.LoadHotfixAssembly(data); IStaticMethod tmpInitMethod = null; #if ILRuntime tmpInitMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, INIT_METHOD_NAME, 0); mUpdateMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, UPDATE_METHOD_NAME, 0); mLateUpdateMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, LATE_UPDATE_METHOD_NAME, 0); mFixedUpdateMethod = new ILStaticMethod(HotFixHelper.Appdomain, ENTRY_CLASS_NAME, FIXED_UPDATE_METHOD_NAME, 0); #else Type tmpType = HotFixHelper.HotFixAssembly.GetType(ENTRY_CLASS_NAME); tmpInitMethod = new MonoStaticMethod(tmpType, INIT_METHOD_NAME); mUpdateMethod = new MonoStaticMethod(tmpType, UPDATE_METHOD_NAME); mLateUpdateMethod = new MonoStaticMethod(tmpType, LATE_UPDATE_METHOD_NAME); mFixedUpdateMethod = new MonoStaticMethod(tmpType, FIXED_UPDATE_METHOD_NAME); #endif tmpInitMethod.Run(); }
public static void LoadHotfix(GameObject code) { #if USE_HOT Log.Info($"当前使用的是ILRuntime模式"); appDomain = new AppDomain(); //适配器注册 ILHelper.InitILRuntime(appDomain); ILHelper.InitAdaptor<RunStart>(appDomain); byte[] assBytes = code.Get<TextAsset>("Hotfix.dll").bytes; dllStream = new MemoryStream(assBytes); #if USE_PDB byte[] pdbBytes = code.Get<TextAsset>("Hotfix.pdb").bytes; pdbStream = new MemoryStream(pdbBytes); #endif try { #if USE_PDB appDomain.LoadAssembly ( dllStream, pdbStream, new Mono.Cecil.Pdb.PdbReaderProvider() ); #else appDomain.LoadAssembly(dllStream); #endif Start = new ILStaticMethod(appDomain, "DBD.HProxy.HotfixStart", "Start", 0); hotfixTypes = appDomain.LoadedTypes.Values.Select(x => x.ReflectionType).ToList(); #else Log.Info($"当前使用的是Mono模式", LogCategory.Resource); byte[] assBytes = code.Get<TextAsset>("Hotfix.dll").bytes; byte[] pdbBytes = code.Get<TextAsset>("Hotfix.pdb").bytes; assembly = Assembly.Load(assBytes, pdbBytes); Type hotfixInit = assembly.GetType("DBD.HProxy.HotfixStart"); Start = new InnerStaticMethod(hotfixInit, "Start"); hotfixTypes = assembly.GetTypes().ToList(); //foreach (var item in hotfixTypes) //{ // Log.Info("HotfixBuiltin type" + item.FullName + "-" + item.Name); //} #endif GotoHotfix(); #if USE_HOT } catch (Exception ex) { throw new Exception(ex.ToString()); } finally { CentorPivot.This.GetComponent<ResourceComponent>().UnloadAsset(code, AssetCategory.Code); } #endif }