2.ILRuntimeManager逻辑处理
2.1 知识点
重新生成热更工程
重新生成热更工程,因为热更工程是要放到ab包中,所以把后缀改成txt,这样ab包才能识别,把它放到AB包中。
重写ILRuntimeManager
主要修改的地方是从AB中加载dll和pdb文件。
/// <summary>
/// 启动ILRuntime 加载对应的dll和pdb文件
/// </summary>
public void StartILRuntime(UnityAction callBack)
{
if (!isStart)
{
isStart = true;
//初始化AppDomain
appDomain = new AppDomain(ILRuntimeJITFlags.JITOnDemand);
//加载对应的dll和pdb等文件 需要从AB包中去加载
//通过AB包管理器 异步加载DLL文件信息
AssetBundleManager.Instance.LoadAssetBundleResourceAsync<TextAsset>("dll_res", "HotFix_Project.dll",
(dll) =>
{
//异步加载完dll后 再去异步加载pdb文件 加载结束后 再使用他们来进行初始化
AssetBundleManager.Instance.LoadAssetBundleResourceAsync<TextAsset>("dll_res", "HotFix_Project.pdb",
(pdb) =>
{
//根据加载的文本信息 初始化 对应的两个流对象
dllStream = new MemoryStream(dll.bytes);
pdbStream = new MemoryStream(pdb.bytes);
//利用初始化的流对象 进行ILRuntime的初始化
appDomain.LoadAssembly(dllStream, pdbStream, new PdbReaderProvider());
//初始化相关的操作
InitILRuntime();
if (isDebug)
{
StartCoroutine(WaitDebugger(callBack));
}
else
{
//加载结束 初始化结束 把逻辑交给外部继续处理
callBack?.Invoke();
}
});
});
}
}
2.2 知识点代码
using ILRuntime.Mono.Cecil.Pdb;
using ILRuntime.Runtime;
using ILRuntime.Runtime.Enviorment;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using BaseFramework;
using UnityEngine;
using UnityEngine.Events;
public class ILRuntimeManager : BaseSingletonInMonoBehaviour<ILRuntimeManager>
{
public AppDomain appDomain;
//dll文件和pdb文件的流对象
private MemoryStream dllStream;
private MemoryStream pdbStream;
//是否已经加载了对应的文件
private bool isStart = false;
//是否是调试模式
private bool isDebug = false;
/// <summary>
/// 启动ILRuntime 加载对应的dll和pdb文件
/// </summary>
public void StartILRuntime(UnityAction callBack)
{
if (!isStart)
{
isStart = true;
//初始化AppDomain
appDomain = new AppDomain(ILRuntimeJITFlags.JITOnDemand);
//加载对应的dll和pdb等文件 需要从AB包中去加载
//通过AB包管理器 异步加载DLL文件信息
AssetBundleManager.Instance.LoadAssetBundleResourceAsync<TextAsset>("dll_res", "HotFix_Project.dll",
(dll) =>
{
//异步加载完dll后 再去异步加载pdb文件 加载结束后 再使用他们来进行初始化
AssetBundleManager.Instance.LoadAssetBundleResourceAsync<TextAsset>("dll_res", "HotFix_Project.pdb",
(pdb) =>
{
//根据加载的文本信息 初始化 对应的两个流对象
dllStream = new MemoryStream(dll.bytes);
pdbStream = new MemoryStream(pdb.bytes);
//利用初始化的流对象 进行ILRuntime的初始化
appDomain.LoadAssembly(dllStream, pdbStream, new PdbReaderProvider());
//初始化相关的操作
InitILRuntime();
if (isDebug)
{
StartCoroutine(WaitDebugger(callBack));
}
else
{
//加载结束 初始化结束 把逻辑交给外部继续处理
callBack?.Invoke();
}
});
});
}
}
private void InitILRuntime()
{
//如果想使用Unity自带的性能调试窗口 调试ILRuntime相关内容 就需要加入该行代码
appDomain.UnityMainThreadID = Thread.CurrentThread.ManagedThreadId;
}
IEnumerator WaitDebugger(UnityAction callBack)
{
while (!appDomain.DebugService.IsDebuggerAttached)
yield return null;
yield return new WaitForSeconds(1f);
callBack?.Invoke();
}
/// <summary>
/// 停止ILRutnime 卸载对应文件
/// </summary>
public void StopILRuntime()
{
if (dllStream != null)
dllStream.Close();
if (pdbStream != null)
pdbStream.Close();
dllStream = null;
pdbStream = null;
appDomain = null;
isStart = false;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com