Skip to content

Commit

Permalink
[修复]1. 修复编辑器的情况下。重复加载程序集导致双重域的问题
Browse files Browse the repository at this point in the history
AlianBlank committed Oct 16, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent c1584e1 commit 1a98502
Showing 1 changed file with 34 additions and 14 deletions.
48 changes: 34 additions & 14 deletions Assets/Scripts/Framework/Procedure/HotfixHelper.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Linq;
using System;
using System.Linq;
using System.Reflection;
using GameFrameX.Runtime;
using HybridCLR;
@@ -7,35 +8,54 @@ namespace Unity.Startup.Procedure
{
public static class HotfixHelper
{
const string HotfixName = "Unity.Hotfix";

public static async void StartHotfix()
{
Log.Info("开始加载AOT DLL");
if (!ApplicationHelper.IsEditor)
if (ApplicationHelper.IsEditor)
{
var aotDlls = AOTGenericReferences.PatchedAOTAssemblyList.ToArray();
foreach (var aotDll in aotDlls)
var assemblies = Utility.Assembly.GetAssemblies();
foreach (var assembly in assemblies)
{
Log.Info("开始加载AOT DLL ==> " + aotDll);
var assetHandle = await GameApp.Asset.LoadAssetAsync<UnityEngine.Object>(Utility.Asset.Path.GetAOTCodePath(aotDll));
var aotBytes = assetHandle.GetAssetObject<UnityEngine.TextAsset>().bytes;
RuntimeApi.LoadMetadataForAOTAssembly(aotBytes, HomologousImageMode.SuperSet);
if (assembly.GetName().Name.Equals(HotfixName, StringComparison.OrdinalIgnoreCase))
{
Run(assembly);
break;
}
}

return;
}

Log.Info("开始加载AOT DLL");

var aotDlls = AOTGenericReferences.PatchedAOTAssemblyList.ToArray();
foreach (var aotDll in aotDlls)
{
Log.Info("开始加载AOT DLL ==> " + aotDll);
var assetHandle = await GameApp.Asset.LoadAssetAsync<UnityEngine.Object>(Utility.Asset.Path.GetAOTCodePath(aotDll));
var aotBytes = assetHandle.GetAssetObject<UnityEngine.TextAsset>().bytes;
RuntimeApi.LoadMetadataForAOTAssembly(aotBytes, HomologousImageMode.SuperSet);
}

Log.Info("结束加载AOT DLL");
Log.Info("开始加载Unity.Hotfix.dll");
var assetHotfixDllPath = Utility.Asset.Path.GetCodePath("Unity.Hotfix.dll");
var assetHotfixDllPath = Utility.Asset.Path.GetCodePath(HotfixName + Utility.Const.FileNameSuffix.DLL);
var assetHotfixDllOperationHandle = await GameApp.Asset.LoadAssetAsync<UnityEngine.Object>(assetHotfixDllPath);
var assemblyDataHotfixDll = assetHotfixDllOperationHandle.GetAssetObject<UnityEngine.TextAsset>().bytes;
Log.Info("开始加载Unity.Hotfix.pdb");
var assetHotfixPdbPath = Utility.Asset.Path.GetCodePath("Unity.Hotfix.pdb");
var assetHotfixPdbPath = Utility.Asset.Path.GetCodePath(HotfixName + Utility.Const.FileNameSuffix.PDB);
var assetHotfixPdbOperationHandle = await GameApp.Asset.LoadAssetAsync<UnityEngine.Object>(assetHotfixPdbPath);
var assemblyDataHotfixPdb = assetHotfixPdbOperationHandle.GetAssetObject<UnityEngine.TextAsset>().bytes;
Log.Info("开始加载程序集Hotfix");
var ass = Assembly.Load(assemblyDataHotfixDll, assemblyDataHotfixPdb);
var hotfixAssembly = Assembly.Load(assemblyDataHotfixDll, assemblyDataHotfixPdb);
Run(hotfixAssembly);
}

Log.Info("加载程序集Hotfix 结束 Assembly " + ass.FullName);
var entryType = ass.GetType("Hotfix.HotfixLauncher");
private static void Run(Assembly assembly)
{
Log.Info("加载程序集Hotfix 结束 Assembly " + assembly.FullName);
var entryType = assembly.GetType("Hotfix.HotfixLauncher");
Log.Info("加载程序集Hotfix 结束 EntryType " + entryType.FullName);
var method = entryType.GetMethod("Main");
Log.Info("加载程序集Hotfix 结束 EntryType=>method " + method?.Name);

0 comments on commit 1a98502

Please sign in to comment.