UH4L1——环境搭建和开发方式

ILRuntime环境搭建

想要正常使用ILRuntime的注意事项:

  1. 修改manifest.json文件中的配置
  2. Allow ‘unsafe’ Code 选项
  3. 通过HotFix_Project工程生成用于热更的dll和pdb文件

ILRuntime的基本原理就是利用Mono.Cecil库,去解释执行热更工程中DLL中的代码

环境搭建具体步骤

  1. 修改工程文件夹下Packages文件夹中的manifest.json文件,在 dependencies​ 字段前加上:

    image

    1
    2
    3
    4
    5
    6
    7
    8
    9
    "scopedRegistries": [
    {
    "name": "ILRuntime",
    "url": "https://registry.npmjs.org",
    "scopes": [
    "com.ourpalm"
    ]
    }
    ],

    保存后就会弹出该窗口

    image

    或者在 ProjectSetting 中的 Package Manager 添加对应信息

    1
    2
    3
    Name: ILRuntime
    Url: https://registry.npmjs.org
    Scopes: com.ourpalm

    image

  2. 在Unity工具栏中的 Window 中打开 Package Manager
    左上角的Packages选择My Registries选项,选择其中的ILRuntime并安装,安装完成后 再导入其示例工程

    image

    不要忘记导入这个示例

    image

  3. 这时会出现报错,因为ILRuntime中会用到C#中的unsafe​关键字,
    我们需要在工具栏的 Edit 中选择 Project Settings,在Other Setting 中 勾选 Allow ‘unsafe’ Code 的选项

    image

  4. 执行完上述操作后,可以在工具栏看到ILRuntime的选项

    image

ILRuntime的开发方式

通过知识点一导入ILRuntime的工具后,我们可以在 工程目录下的 Samples\ILRuntime\2.1.0\Demo​ 文件夹中
看到一个HotFix_Project的文件夹,该文件夹在编辑器中无法看到,需要在文件浏览器中查看,该工程就是我们的热更工程

处于Assets文件夹下的文件夹,如果文件夹名字的最后一个字符为~​,则该文件夹不会在Project窗口内显示

image

ILRuntime的开发方式分成了两个部分

  1. 直接在Unity工程中进行非热更部分的开发(和以前写C#一样)
  2. 在热更工程中开发需要热更新的部分(同样使用C#)

导入ILRuntime过后我们需要在两个工程之间切换开发,两个工程之间可以相互访问调用,这就是在开发ILRuntime热更项目时的工作方式

什么是ILRuntime中的跨域访问

ILRuntime中的跨域访问就是指 在原始的Unity工程之间 和 热更工程 之间的相互访问调用

比如:

  • 在Unity工程中使用热更工程中声明的内容(类、委托、函数等)
  • 在热更工程中使用Unity工程中声明的内容(类、委托、函数等)

执行我们的第一个ILRuntime热更程序

  1. 通过文件浏览器打开 HotFix_Project 工程(如果报错,请修改工程的目标框架)

    image

  2. 生成成功后,可以在Unity工程的 StreamingAssets 文件夹中看到 HotFix_Project 的两个文件,一个是dll文件、一个是pdb文件

    image

    它的原理是设置了输出路径到本工程下的Assets文件夹下的StreamingAssets文件夹(在相对路径中 ..\​ 相对于上级目录)

    image

  3. 打开示例工程HelloWorld,运行。成功后可以在Console窗口看到打印信息

    image

ILRuntime的基本原理

关键点:Mono.Cecil​ 库,它是一个专门用于读取C#编译的DLL的开源第三方库,通过它我们可以获取到

  1. DLL中的类型和方法原信息
  2. 读取方法体的IL汇编指令(何为IL:C#编译出来的中间语言,详见:CS5L1——.NET相关知识)
  3. 可以读取PDB调试符号表文件,用于断点调试等等
  4. 可以修改DLL中的元信息和方法体内容并写回DLL

ILRuntime通过该库,在运行时通过读取解释DLL文件中的内容来执行我们热更的代码