123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- using ILRuntime.Runtime.Enviorment;
- using System.Collections;
- using System.IO;
- using UnityEngine;
- using FairyGUI;
- using System.Reflection;
- using GFGGame.Launcher;
- //using ILRuntime.Generated.CrossBinding;
- using System;
- using VEngine;
- using System.Linq;
- //下面这行为了取消使用WWW的警告,Unity2018以后推荐使用UnityWebRequest,处于兼容性考虑Demo依然使用WWW
- #pragma warning disable CS0618
- namespace GFGGame
- {
- class ILRuntimeLauncher : SingletonMonoBase<ILRuntimeLauncher>
- {
- ILRuntime.Runtime.Enviorment.AppDomain appdomain;
- System.IO.MemoryStream dllStream;
- System.IO.MemoryStream pdbStream;
- public void LoadAssembly(byte[] assBytes, byte[] pdbBytes)
- {
- //首先实例化ILRuntime的AppDomain,AppDomain是一个应用程序域,每个AppDomain都是一个独立的沙盒
- appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();
- dllStream = new MemoryStream(assBytes);
- pdbStream = new MemoryStream(pdbBytes);
- try
- {
- appdomain.LoadAssembly(dllStream, pdbStream, new ILRuntime.Mono.Cecil.Pdb.PdbReaderProvider());
- }
- catch
- {
- Debug.LogError("加载热更DLL失败,请确保已经编译过热更DLL");
- }
- InitializeILRuntime();
- OnILHotFixLoaded();
- }
- void InitializeILRuntime()
- {
- #if DEBUG && (UNITY_EDITOR || UNITY_ANDROID || UNITY_IPHONE)
- //由于Unity的Profiler接口只允许在主线程使用,为了避免出异常,需要告诉ILRuntime主线程的线程ID才能正确将函数运行耗时报告给Profiler
- appdomain.UnityMainThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId;
- appdomain.DebugService.StartDebugService(56000);
- #endif
- //在使用LitJson前,需要对LitJson进行注册
- ILRuntimeHelper.RegisterILRuntimeCLRRedirection(appdomain);
- //这里做一些ILRuntime的注册,如委托适配器,值类型绑定等等
- appdomain.DelegateManager.RegisterMethodDelegate<EventContext>();
- appdomain.DelegateManager.RegisterMethodDelegate<System.String>();
- appdomain.DelegateManager.RegisterMethodDelegate<System.String, System.String, UnityEngine.LogType>();
- appdomain.DelegateManager.RegisterMethodDelegate<System.Object>();
- appdomain.DelegateManager.RegisterMethodDelegate<System.Int32, FairyGUI.GObject>();
- appdomain.DelegateManager.RegisterMethodDelegate<FairyGUI.GTweener>();
- appdomain.DelegateManager.RegisterFunctionDelegate<System.Int32, System.Int32, System.Int32>();
- appdomain.DelegateManager.RegisterFunctionDelegate<ILRuntime.Runtime.Intepreter.ILTypeInstance, ILRuntime.Runtime.Intepreter.ILTypeInstance, System.Int32>();
- appdomain.DelegateManager.RegisterMethodDelegate<System.Object, System.Timers.ElapsedEventArgs>();
- appdomain.DelegateManager.RegisterDelegateConvertor<EventCallback0>((action) =>
- {
- return new EventCallback0(() =>
- {
- ((System.Action)action)();
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<EventCallback1>((action) =>
- {
- return new EventCallback1((e) =>
- {
- ((System.Action<EventContext>)action)(e);
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<UnityEngine.Application.LogCallback>((act) =>
- {
- return new UnityEngine.Application.LogCallback((condition, stackTrace, type) =>
- {
- ((Action<System.String, System.String, UnityEngine.LogType>)act)(condition, stackTrace, type);
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<FairyGUI.TimerCallback>((act) =>
- {
- return new FairyGUI.TimerCallback((param) =>
- {
- ((Action<System.Object>)act)(param);
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<FairyGUI.ListItemRenderer>((act) =>
- {
- return new FairyGUI.ListItemRenderer((index, item) =>
- {
- ((Action<System.Int32, FairyGUI.GObject>)act)(index, item);
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<FairyGUI.GTweenCallback1>((act) =>
- {
- return new FairyGUI.GTweenCallback1((tweener) =>
- {
- ((Action<FairyGUI.GTweener>)act)(tweener);
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<System.Comparison<System.Int32>>((act) =>
- {
- return new System.Comparison<System.Int32>((x, y) =>
- {
- return ((Func<System.Int32, System.Int32, System.Int32>)act)(x, y);
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<FairyGUI.GTweenCallback>((act) =>
- {
- return new FairyGUI.GTweenCallback(() =>
- {
- ((Action)act)();
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<FairyGUI.PlayCompleteCallback>((act) =>
- {
- return new FairyGUI.PlayCompleteCallback(() =>
- {
- ((Action)act)();
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<FairyGUI.TransitionHook>((act) =>
- {
- return new FairyGUI.TransitionHook(() =>
- {
- ((Action)act)();
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<System.Comparison<ILRuntime.Runtime.Intepreter.ILTypeInstance>>((act) =>
- {
- return new System.Comparison<ILRuntime.Runtime.Intepreter.ILTypeInstance>((x, y) =>
- {
- return ((Func<ILRuntime.Runtime.Intepreter.ILTypeInstance, ILRuntime.Runtime.Intepreter.ILTypeInstance, System.Int32>)act)(x, y);
- });
- });
- appdomain.DelegateManager.RegisterDelegateConvertor<System.Timers.ElapsedEventHandler>((act) =>
- {
- return new System.Timers.ElapsedEventHandler((sender, e) =>
- {
- ((Action<System.Object, System.Timers.ElapsedEventArgs>)act)(sender, e);
- });
- });
- //appdomain.RegisterCrossBindingAdaptor(new ScriptableObjectAdapter());
- //初始化CLR绑定请放在初始化的最后一步!!
- ILRuntime.Runtime.Generated.CLRBindings.Initialize(appdomain);
- }
- void OnILHotFixLoaded()
- {
- HotUpdateCodeLoader.Instance.allTypes = appdomain.LoadedTypes.Values.Select(x => x.ReflectionType).ToArray();
- //第一次方法调用
- appdomain.Invoke("GFGGame.HotUpdate.HotUpdateEntry", "Start", null, null);
- }
-
- }
- }
|