2.ILRuntimeManager逻辑处理

  1. 2.ILRuntimeManager逻辑处理
    1. 2.1 知识点
      1. 重新生成热更工程
      2. 重写ILRuntimeManager
    2. 2.2 知识点代码

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

×

喜欢就点赞,疼爱就打赏