Exemple #1
0
        public static void Init(IResLoad resLoad = null)
        {
            if (appdomain != null)
            {
                return;
            }

#if UNITY_EDITOR
            DllInitByEditor.Release();
#endif
            if (resLoad == null)
            {
#if UNITY_EDITOR
                ResLoad.Set(new EditorResLoad());
#endif
            }
            else
            {
                ResLoad.Set(resLoad);
            }

            InitHotModule();

            refType = new RefType("hot.hotApp");
            refType.TryInvokeMethod("Init");

            AllTypes = new List <IType>();
            foreach (var ator in appdomain.LoadedTypes)
            {
                AllTypes.Add(ator.Value);
            }

            AutoReplace(AllTypes);
            InitByProperty(typeof(AutoInitAndRelease), "Init", AllTypes);
        }
Exemple #2
0
        // 释放所有热更模块
        public static void ReleaseAll()
        {
            if (appdomain == null)
            {
                return;
            }

            ResLoad.Set(null);
            refType.TryInvokeMethod("ReleaseAll");
            //var types = new Dictionary<string, IType>(appdomain.LoadedTypes);
            InitByProperty(typeof(AutoInitAndRelease), "Release", AllTypes);

            foreach (var ator in Fields)
            {
                ator.SetValue(null, null);
            }
            Fields.Clear();

            IL.Help.ReleaseAll();
            AllTypes.Clear();
            AllTypes  = null;
            refType   = null;
            appdomain = null;
            System.GC.Collect();
        }
Exemple #3
0
        static public void InitHotModule(TextAsset dll)
        {
            appdomain = new AppDomain();
            appdomain.RegisterCrossBindingAdaptor(new CoroutineAdapter());

#if UNITY_EDITOR
            System.Type clrType = System.Type.GetType("ILRuntime.Runtime.Generated.CLRBindings");
            if (clrType != null)
            {
                clrType.GetMethod("Initialize").Invoke(null, new object[] { appdomain });
            }
#else
            ILRuntime.Runtime.Generated.CLRBindings.Initialize(appdomain);
#endif
            ILRuntime.Runtime.Generated.UnityEngine_Debug_Binding.Register(appdomain);

#if UNITY_EDITOR
            ResLoad.Set(new EditorResLoad());
#endif

            try
            {
#if TEST_MODEL
                var dlldata = ResLoad.GetStream(Paths.HOT_DLL_PATH);
                DllStream = CopyStream(dlldata);
#elif BUILD_MODEL
                DllStream = CopyStream(new MemoryStream(dll.bytes));
#endif
                if (DllStream != null)
                {
#if USE_PDB
                    var pdbdata = ResLoad.GetStream(Paths.HOT_PDB_PATH);
                    SymbolStream = CopyStream(pdbdata);
                    appdomain.LoadAssembly(DllStream, SymbolStream, new ILRuntime.Mono.Cecil.Pdb.PdbReaderProvider());
                    //启动调试服务器
                    appdomain.DebugService.StartDebugService(56000);
#elif USE_MDB
                    SymbolStream = CopyStream(ResLoad.GetStream("Data/DyncDll.mdb"));
                    appdomain.LoadAssembly(DllStream, SymbolStream, new ILRuntime.Mono.Cecil.Mdb.MdbReaderProvider());
#else
                    appdomain.LoadAssembly(DllStream);
#endif
                }
            }
            catch (System.Exception ex)
            {
                wxb.L.LogException(ex);
            }

            RegDelegate(appdomain);
            IL.Help.Init();
        }
Exemple #4
0
        // 释放所有热更模块
        public static void ReleaseAll()
        {
            if (appdomain == null)
            {
                return;
            }

            ResLoad.Set(null);
            refType.TryInvokeMethod("ReleaseAll");
            //var types = new Dictionary<string, IType>(appdomain.LoadedTypes);
            InitByProperty(typeof(AutoInitAndRelease), "Release", AllTypes);

            foreach (var ator in Fields)
            {
                ator.SetValue(null, null);
            }
            Fields.Clear();

            // 释放CLR绑定,类继承等全局变量
            {
#if UNITY_EDITOR
                CallStatic("ILRuntime.Runtime.Generated.CLRBindings", "Shutdown", appdomain);
                CallStatic("wxb.AllAdapter", "Shutdown", appdomain);
#else
                ILRuntime.Runtime.Generated.CLRBindings.Shutdown(appdomain);
                AllAdapter.Release();
#endif
            }

            IL.Help.ReleaseAll();
            AllTypes.Clear();
            AllTypes  = null;
            refType   = null;
            appdomain = null;
            if (DllStream != null)
            {
                DllStream.Close();
                DllStream = null;
            }

#if USE_PDB || USE_MDB
            if (SymbolStream != null)
            {
                SymbolStream.Close();
                SymbolStream = null;
            }
#endif
            System.GC.Collect();
        }
Exemple #5
0
        public static void Init(IResLoad resLoad = null)
        {
            if (appdomain != null)
            {
                return;
            }

#if UNITY_EDITOR
            DllInitByEditor.Release();
#endif
            if (resLoad == null)
            {
#if UNITY_EDITOR
                ResLoad.Set(new EditorResLoad());
#endif
            }
            else
            {
                ResLoad.Set(resLoad);
            }

            InitHotModule();

#if HOT_DEBUG
            if (UnityEngine.Application.isPlaying)
            {
                System.Type debugger_type;
                if (IL.Help.TryGetTypeByFullName("hot.Debugger", out debugger_type))
                {
                    var    debugger = new RefType(true, debugger_type);
                    object port     = debugger.TryGetField("port");
                    if (port != null)
                    {
                        var ds = appdomain.DebugService;
                        ds.StartDebugService((int)port);
                        object vsWaitTimeoutTime = debugger.TryGetField("vsWaitTimeoutTime");
                        if (vsWaitTimeoutTime != null)
                        {
                            int wt = (int)vsWaitTimeoutTime;
                            if (wt > 0)
                            {
                                L.Log("vsWait begin!");
                                int count = 0;
                                while (!ds.IsDebuggerAttached)
                                {
                                    System.Threading.Thread.Sleep(1000);
                                    ++count;
                                    if (count >= wt)
                                    {
                                        L.Log("vsWait timeout!");
                                        break;
                                    }
                                }
                                L.Log("vsWait end!");
                            }
                        }
                    }
                }
            }
#endif
            refType = new RefType("hot.hotApp");
            refType.TryInvokeMethod("Init");

            AllTypes = new List <IType>();
            foreach (var ator in appdomain.LoadedTypes)
            {
                AllTypes.Add(ator.Value);
            }

            AutoReplace(AllTypes);
            InitByProperty(typeof(AutoInitAndRelease), "Init", AllTypes);
        }