ILRuntime
2021-04-02 / YJX

ILRuntime

ILRuntime的实现原理

  • ILRuntime借助Mono.Cecil库来读取DLL的PE信息,以及当中类型的所有信息,最终得到方法的IL汇编码,然后通过内置的IL解译执行虚拟机来执行DLL中的代码。

ILRuntime的环境搭建

  • Unity版本:在2018以上版本可直接通过Package Manager安装。

  • VS版本:ILRuntime提供了一个支持Visual Studio 2015、Visual Studio 2017和Visual Studio 2019的调试插件,用来源码级调试你的热更脚本。

  • Unity环境:由于ILRuntime使用了unsafe代码来优化执行效率,所以你需要在Unity中开启unsafe模式。(以2019.4.13为例:File=>PlayerSettings=>OtherSettings\Allow’unsafe’Code(勾选))

[ILRuntimeU3D示例工程]

  • 获取途径
  • 运行示例工程
    ILRuntimeU3D示例工程中通过读取StreamingAssets文件夹下的HotFix_Project.dllHotFix_Project.pdb,两个文件来模拟热更。但示例工程Asset下没有StreamingAssets文件夹以及用到的文件,需要进行以下操作:
    • 在资源管理器中打开ILRuntime中Demo文件夹在文件夹中可以看到 HotFix_Project~ 文件夹(文件夹为示例工程中dll的VS工程),运行并生成文件夹中的VS工程解决方案。
    • 刷新ILRuntimeU3D示例工程Asset,会生成StreamingAssets文件夹以及HotFix_Project.dllHotFix_Project.pdb文件。
    • 选择示例场景即可正常运行ILRuntimeU3D示例工程。
  • 更改示例工程热更代码
    • HotFix_ProjectVS工程修改完毕想要的逻辑后。生成解决方案即可自行覆盖原dll。

ILRuntime功能实现 (持续更新)

  • 在官方Demo中各个场景对应的脚本都有详细的注释演示。此部分建议看官方Demo,未在项目中使用,暂时根据官方Demo的方法运行一遍,后期特殊运用持续更新

    • ILRuntimeDemo中脚本用法相对详细。
      • AppDomain:AppDomain是ILRuntime的入口

        1
        2
        3
        //AppDomain是ILRuntime的入口,最好是在一个单例类中保存,整个游戏全局就一个
        //首先实例化ILRuntime的AppDomain,AppDomain是一个应用程序域,每个AppDomain都是一个独立的沙盒
        AppDomain appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();
      • 读取加载dll:将Dll 与 PDB文件 转换为Byte[] 然后appdomain进行加载读取。

        1
        2
        3
        4
        5
        6
        7
        System.IO.MemoryStream fs;
        System.IO.MemoryStream p;
        byte[] dll;
        byte[] pdb;
        fs = new MemoryStream(dll);
        p = new MemoryStream(pdb);
        appdomain.LoadAssembly(fs, p, new ILRuntime.Mono.Cecil.Pdb.PdbReaderProvider());
      • 调用dll中方法:在官方Demo中各个场景对应的脚本都有详细的注释演示。

记录疑问解答(持续更新)

本文链接:
http://yjx-start.github.io/2021/04/02/ilruntime-ji-zhu-wen-dang/