UH4L19——类型系统

类型系统的作用

类型系统用于表示热更工程中的各种类型、方法、成员、实例对象等等信息
相当于,ILRuntime帮助我们利用它内部的解释器,将我们实现的代码解释翻译为了自己的一套类型规则
在真正执行代码时,都是基于ILRuntime自己的类型系统中的规则来执行的

说人话:类型系统 是 热更工程中的类、方法、成员等信息 的载体

如何理解这个所谓载体

假设我们在ILRuntime的热更新工程内创建了一个Test​类,里面有成员属性A​和成员方法TestFun
这个类随热更新工程会被编译为DLL文件,在DLL文件内部就包含了编译出来的Test​类的IL中间代码,
我们并不能直接在主工程内调用这个DLL文件内部的类,因此需要使用ILRuntime来帮助我们获取、记录并执行其中的IL中间代码

而ILRuntime会借助Mono.Cecil​读取DLL文件内部的IL中间代码,获取其中的类型和元消息,这里面就包括Test​类和它的成员
ILRuntime在读取到类型消息和元消息后,就会翻译这些信息,然后使用类型系统下继承IType​的类对象记录的翻译出来的消息
Test​类消息就会被一个继承IType​的类对象记录,而它的成员属性A​和方法TestFun​也会被对应的继承IMethod​的对象记录

这也是为什么我们需要通过IType​接口获取构造方法,属性,方法等IMethod​消息然后调用,才能执行热更DLL文件内的逻辑

因此,准确来说,我们在主工程内调用的热更工程相关的类和方法实际上都是由ILRuntime类型系统去记录消息

类型系统就是 ILRuntime 用于 解释 热更工程中所有类、方法、属性等信息后 逻辑的载体
ILRuntime 读取 DLL 后,通过解释器,将其中的 IL 中间代码信息翻译为符合类型系统规则信息
我们可以利用它来执行 DLL 当中的代码逻辑

类型系统中的关键接口

  • IType​ 所有ILRuntime内类型的基类,它下面的内容就会记录

    • CLRType​:代表主工程中的类型

    • ILType​: 热更工程中的类型

      • StaticInstance​(类型静态实例,用于保存该类型静态字段)
    • ReflectedType​: 对应的反射类型

      • ILRuntimeType​: 热更工程中的类型对应的反射类型
      • ILRuntimeWraperType​: 主工程中的类型对应的反射类型
    • TypeForCLR​: IType​ 在主工程中对应的真实类型

      • 没有跨域继承——拿到的类型会是 ILTypeInstance
      • 有跨域继承——拿到的类型会是 适配器类型
  • IMethod​ 所有方法的基类

    • CLRMethod​ 主工程中定义的方法

    • ILMethod​ 热更工程中定义的方法

      • Method Body(方法体)
      • Instruction(指令相关)
  • ILTypeInstance​ 热更内类型的实例均为该类型 委托和装箱后的枚举均为此类型派生

    • ILTypeStaticInstance​ 静态字段
    • ILEnumTypeInstance​ 枚举字段
    • DelegateAdapter​ 委托适配器
    • Fields​ 所有字段
    • ManagedObjects​ 引用类型对象实例
  • 委托

    • DelegateAdapter​ 委托适配器

    • DummyDelegateAdapter​ 热更中的委托,没有跨域调用 对应该类型

    • Delegate​ 转换

      • 转换为 Action​ / Func
      • 转换为自定义委托类型

学习类型系统的目的

大概了解了类型系统的作用和构成后,我们再反观之前学习的知识点,我们能够明白之前为什么要那样做

例如我们要通过AppDomain​去获取IType​,然后实例化出一个继承ILTypeInstance​的对象,然后通过IMethod​调用属性和方法等等