JisolGame/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs
2024-10-15 02:12:55 +08:00

53 lines
2.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Linq;
using System.Reflection;
using Cysharp.Threading.Tasks;
using HybridCLR;
using Plugins.SHFrame.SHGame.Procedure;
using SHFrame;
using SHFrame.FSM;
using YooAsset;
namespace HotMain.SHGame.Procedure
{
public class ProcedureLoadLauncher : ProcedureBase
{
private static Assembly _launcherAss;
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
CreatePackageDownloader(procedureOwner).Forget();
}
private async UniTask CreatePackageDownloader(IFsm<IProcedureManager> procedureOwner)
{
// 打包时内置在包体内的资源 直接先使用包体资源,实例化 登录加载界面后,再去检查是否需要下载更新
//加载AOT
await LoadMetadataForAOTAssemblies();
}
/// <summary>
/// 为aot assembly加载原始metadata 这个代码放aot或者热更新都行。
/// 一旦加载后如果AOT泛型函数对应native实现不存在则自动替换为解释模式执行
/// </summary>
private async UniTask LoadMetadataForAOTAssemblies()
{
var package = YooAssets.GetPackage(ProcedureInitializePackage.RawFilePackageName);
Log.Debug("加载AOT泛型dll数据");
// 注意补充元数据是给AOT dll补充元数据而不是给热更新dll补充元数据。
// 热更新dll不缺元数据不需要补充如果调用LoadMetadataForAOTAssembly会返回错误
var mode = HomologousImageMode.SuperSet;
foreach (var aotDllName in ProcedureInitializePackage.AotMetaAssemblyFiles)
{
var handle = package.LoadRawFileSync(aotDllName);
await handle.ToUniTask();
// 加载assembly对应的dll会自动为它hook。一旦aot泛型函数的native函数不存在用解释器版本代码
var err = RuntimeApi.LoadMetadataForAOTAssembly(handle.GetRawFileData(), mode);
Log.Debug($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
}
}
}
}