using System; using System.Collections.Generic; using System.IO; using ILCrossBinding; using ILRuntime.CLR.Method; using ILRuntime.Mono.Cecil.Pdb; using ILRuntime.Runtime.Intepreter; using Snxxz.UI; using UnityEngine; public class ILLauncherProxy : SingletonMonobehaviour { FileStream dllFS, pdbFS; private ILRuntime.Runtime.Enviorment.AppDomain _appdomain; public ILRuntime.Runtime.Enviorment.AppDomain appdomain { get { return _appdomain; } } public bool started; ILTypeInstance launcherInstance; IMethod update, onDestroy; public void Init() { started = false; LoadILRuntime(); //由于Unity的Profiler接口只允许在主线程使用,为了避免出异常,需要告诉ILRuntime主线程的线程ID才能正确将函数运行耗时报告给Profiler #if UNITY_EDITOR _appdomain.UnityMainThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId; #endif //对LitJson进行注册 LitJson.JsonMapper.RegisterILRuntimeCLRRedirection(_appdomain); RegisterCrossBindingAdaptor(appdomain); RegisterValueTypeBinder(); RegisterDelegate(); #if UNITY_EDITOR // CLRBindings 是动态生成出来的,editor下可能不存在,所以使用反射方式调用 var type = Type.GetType("ILRuntime.Runtime.Generated.CLRBindings"); if (type != null) { var m = type.GetMethod("Initialize"); m.Invoke(null, new object[] { appdomain }); } #else ILRuntime.Runtime.Generated.CLRBindings.Initialize(_appdomain); #endif } void LoadILRuntime() { _appdomain = new ILRuntime.Runtime.Enviorment.AppDomain(); var dllPath = string.Empty; var pdbPath = string.Empty; if (AssetSource.logicFromEditor) { dllPath = ResourcesPath.ResourcesOutAssetPath + "logic/Logic.dll.bytes"; pdbPath = ResourcesPath.ResourcesOutAssetPath + "logic/Logic.pdb"; } else { dllPath = AssetVersionUtility.GetAssetFilePath("logic/Logic.dll.bytes"); pdbPath = AssetVersionUtility.GetAssetFilePath("logic/Logic.pdb"); } if (!File.Exists(dllPath)) { DebugEx.LogErrorFormat("找不到热更代码:{0}", dllPath); return; } dllFS = new FileStream(dllPath, FileMode.Open); if (VersionConfig.Get().debugVersion && File.Exists(pdbPath)) pdbFS = new FileStream(pdbPath, FileMode.Open); _appdomain.LoadAssembly(dllFS, pdbFS, new PdbReaderProvider()); } //注册跨域继承适配器 public static void RegisterCrossBindingAdaptor(ILRuntime.Runtime.Enviorment.AppDomain domain) { domain.RegisterCrossBindingAdaptor(new CoroutineAdapter()); domain.RegisterCrossBindingAdaptor(new DtcBasicAdapter()); domain.RegisterCrossBindingAdaptor(new GameNetPackBasicAdapter()); domain.RegisterCrossBindingAdaptor(new OperationBaseAdapter()); domain.RegisterCrossBindingAdaptor(new IConfigPostProcessAdapter()); } //注册值类型绑定 private void RegisterValueTypeBinder() { appdomain.RegisterValueTypeBinder(typeof(Vector3), new Vector3Binder()); appdomain.RegisterValueTypeBinder(typeof(Quaternion), new QuaternionBinder()); appdomain.RegisterValueTypeBinder(typeof(Vector2), new Vector2Binder()); } //注册委托 private void RegisterDelegate() { //无返回值 appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate>(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); appdomain.DelegateManager.RegisterMethodDelegate(); //有返回值 appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); appdomain.DelegateManager.RegisterFunctionDelegate(); //自定义委托转换 appdomain.DelegateManager.RegisterDelegateConvertor((action) => { return new UnityEngine.Events.UnityAction(() => { ((System.Action)action)(); }); }); appdomain.DelegateManager.RegisterDelegateConvertor((act) => { return new System.Threading.WaitCallback((state) => { ((Action)act)(state); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new System.Comparison((x, y) => { return ((Func)act)(x, y); }); }); appdomain.DelegateManager.RegisterDelegateConvertor((act) => { return new global::ScrollerController.OnRefreshCellDelegate((type, cell) => { ((Action)act)(type, cell); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new System.Comparison((x, y) => { return ((Func)act)(x, y); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0, arg1, arg2, arg3) => { ((System.Action)act)(arg0, arg1, arg2, arg3); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0, arg1) => { ((System.Action)act)(arg0, arg1); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0) => { ((System.Action)act)(arg0); }); }); appdomain.DelegateManager.RegisterDelegateConvertor>((act) => { return new UnityEngine.Events.UnityAction((arg0, arg1, arg2) => { ((System.Action)act)(arg0, arg1, arg2); }); }); appdomain.DelegateManager.RegisterDelegateConvertor((act) => { return new global::BuffModel.OnObjAddBuff(() => { ((System.Action)act)(); }); }); appdomain.DelegateManager.RegisterDelegateConvertor((act) => { return new global::BuffModel.OnObjDelBuff(() => { ((System.Action)act)(); }); }); } public void LaunchStart() { #if UNITY_EDITOR _appdomain.DebugService.StartDebugService(56000); #endif launcherInstance = appdomain.Instantiate("LogicLauncher"); var type = launcherInstance.Type; update = type.GetMethod("Update"); onDestroy = type.GetMethod("OnDestroy", 0); _appdomain.Invoke("LogicLauncher", "LaunchStart", launcherInstance, null); } private void Update() { if (update != null) appdomain.Invoke(update, launcherInstance); } protected override void OnDestroy() { base.OnDestroy(); if (onDestroy != null) appdomain.Invoke(onDestroy, launcherInstance); #if UNITY_EDITOR var type = Type.GetType("ILRuntime.Runtime.Generated.CLRBindings"); if (type != null) { var m = type.GetMethod("Shutdown"); m.Invoke(null, new object[] { appdomain }); } #else ILRuntime.Runtime.Generated.CLRBindings.Shutdown(appdomain); #endif dllFS?.Close(); pdbFS?.Close(); } }