UH4L19——类型系统
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
调用属性和方法等等