浏览代码

修改热更代码,支持热更model.dll hotfix.dll

大爷 2 年之前
父节点
当前提交
7b40e39ad1
共有 1 个文件被更改,包括 43 次插入29 次删除
  1. 43 29
      Unity/Assets/Scripts/Loader/CodeLoader.cs

+ 43 - 29
Unity/Assets/Scripts/Loader/CodeLoader.cs

@@ -12,8 +12,6 @@ namespace ET
 {
 	public class CodeLoader: Singleton<CodeLoader>
 	{
-		private Assembly model;
-
 		public void Start()
 		{
 			if (Define.EnableCodes)
@@ -27,56 +25,67 @@ namespace ET
 				Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
 				Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(assemblies);
 				EventSystem.Instance.Add(types);
+
+                bool bStart = false;
 				foreach (Assembly ass in assemblies)
 				{
 					string name = ass.GetName().Name;
 					if (name == "Unity.Model.Codes")
 					{
-						this.model = ass;
-					}
+                        //this.model = ass;
+                        bStart= true;
+                        IStaticMethod start = new StaticMethod(ass, "ET.Entry", "Start");
+                        start.Run();
+                        break;
+                    }
 				}
-				
-				IStaticMethod start = new StaticMethod(this.model, "ET.Entry", "Start");
-				start.Run();
+
+                if(!bStart)
+                {
+                    throw new Exception("not found Assembly: 'Unity.Model.Codes'");
+                }
 			}
 			else
 			{
-                LoadAssetsAndHotfix().Forget();
-			}
+                LoadHotfix();
+            }
 		}
 
-        private async UniTaskVoid LoadAssetsAndHotfix()
+        //编译时会检查这个方法,需保留
+        public void LoadHotfix()
+        {
+            AsyncLoadHotfix().Forget();
+        }
+
+        private async UniTaskVoid AsyncLoadHotfix()
         {
             // 启动YooAsset引擎,并在初始化完毕后进行热更代码加载
             await YooAssetProxy.StartYooAssetEngine(YooAssets.EPlayMode.HostPlayMode);
 
             // Shader Warm Up
-            /*ShaderVariantCollection shaderVariantCollection =
+            ShaderVariantCollection shaderVariantCollection =
                 (await YooAssetProxy.LoadAssetAsync<ShaderVariantCollection>(
                     YooAssetProxy.GetYooAssetFormatResPath("ProjectSShaderVariant",
                         YooAssetProxy.YooAssetResType.Shader)))
                 .GetAssetObject<ShaderVariantCollection>();
-
             Stopwatch stopwatch = Stopwatch.StartNew();
             shaderVariantCollection.WarmUp();
             stopwatch.Stop();
-            Log.Info($"Shader Warm Up完成, 耗时: {stopwatch.ElapsedMilliseconds}ms,shaderCount: {shaderVariantCollection.shaderCount} variantCount: {shaderVariantCollection.variantCount}");*/
+            Log.Info($"Shader Warm Up完成, 耗时: {stopwatch.ElapsedMilliseconds}ms,shaderCount: {shaderVariantCollection.shaderCount} variantCount: {shaderVariantCollection.variantCount}");
 
-#if !UNITY_EDITOR
             //给mscorlib.dll等AOT补充元数据
             await LoadMetadataForAOT();
-#endif
-			await LoadHotfixCode();
+            await LoadHotfixCode();
         }
 
+        //TODO: AOT dll列表的配置也可以通过热更新下下来,这样增加了新的泛型就不怕了
 		// 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
 		private async UniTask LoadMetadataForAOT()
 		{
-			//TODO: DLL列表
-			List<string> DLLNameList_ForABLoad = new List<string> (){  } ;
+            HotUpdateAssemblyManifest aotlist = Resources.Load<HotUpdateAssemblyManifest>("HotUpdateAssemblyManifest");
+            var DLLNameList_ForABLoad = aotlist.AOTMetadataDlls;
 
 			List<UniTask<RawFileOperation>> tasks = new List<UniTask<RawFileOperation>>();
-
             foreach (var aotDll in DLLNameList_ForABLoad)
             {
                 tasks.Add(YooAssetProxy.GetRawFileAsync(aotDll));
@@ -88,7 +97,7 @@ namespace ET
                 var ret = RuntimeApi.LoadMetadataForAOTAssembly(task.GetRawBytes(), HomologousImageMode.SuperSet);
                 if (ret == LoadImageErrorCode.OK)
                 {
-                    Log.Info($"LoadMetadataForAOTAssembly({task.GetBundleName()}) ok.");
+                    Log.Debug($"LoadMetadataForAOTAssembly({task.GetBundleName()}) ok.");
                 }
                 else
                 {
@@ -97,19 +106,24 @@ namespace ET
             }
         }
 
-        //TODO: load model.dll  hotfix.dll
-        public async UniTask LoadHotfixCode()
+        //热更加载 model.dll & hotfix.dll
+        private async UniTask LoadHotfixCode()
         {
-            Log.Info("to load hotfix.dll.");
-            byte[] assBytes = (await YooAssetProxy.GetRawFileAsync("Code_ProjectS_Hotfix.dll")).GetRawBytes();
-            byte[] pdbBytes = (await YooAssetProxy.GetRawFileAsync("Code_ProjectS_Hotfix.pdb")).GetRawBytes();
-            var assembly = Assembly.Load(assBytes, pdbBytes);
+            Log.Info("to load model.dll & hotfix.dll.");
+
+            var rawfile_modeldll = await YooAssetProxy.GetRawFileAsync("Model.dll");
+            var rawfile_modelpdb = await YooAssetProxy.GetRawFileAsync("Model.pdb");
+            var modelAssembly = Assembly.Load(rawfile_modeldll.GetRawBytes(), rawfile_modelpdb.GetRawBytes());
+
+            var rawfile_hotfixdll = await YooAssetProxy.GetRawFileAsync("Hotfix.dll");
+            var rawfile_hotfixpdb = await YooAssetProxy.GetRawFileAsync("Hotfix.pdb");
+            var hotfixAssembly = Assembly.Load(rawfile_hotfixdll.GetRawBytes(), rawfile_hotfixpdb.GetRawBytes());
 
-            //Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(typeof(Game).Assembly, typeof(Init).Assembly, this.model, hotfixAssembly);
-            //EventSystem.Instance.Add(types);
+            Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(typeof(Game).Assembly, typeof(Init).Assembly, modelAssembly, hotfixAssembly);
+            EventSystem.Instance.Add(types);
 
             Log.Info("to call Client.Entry.");
-            IStaticMethod start = new MonoStaticMethod(assembly, "ET.Client.Entry", "Start");
+            IStaticMethod start = new MonoStaticMethod(modelAssembly, "ET.Entry", "Start");
             start.Run();
         }
     }