Ejemplo n.º 1
0
        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>();
        }
    }
Ejemplo n.º 3
0
    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 模块的功能可能无法启用");
        }
    }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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

        }