mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 03:14:47 +00:00
53 lines
2.2 KiB
C#
53 lines
2.2 KiB
C#
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}");
|
||
}
|
||
}
|
||
}
|
||
} |