JisolGame/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs

54 lines
2.2 KiB
C#
Raw Normal View History

using System;
using System.Linq;
using System.Reflection;
using Cysharp.Threading.Tasks;
using HybridCLR;
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();
2024-10-15 18:26:52 +08:00
//切换到更新资源版本
ChangeState<ProcedurePackageDownloader>(procedureOwner);
}
/// <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}");
}
}
}
}