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}");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|