UH4L13——Unity反射调用ILRuntime
UH4L13——Unity反射调用ILRuntime
ILRuntime反射相关
-
Unity中反射使用ILRuntime热更工程中内容
-
通过
IType
获取类型消息1
2IType type = appdomain.LoadedTypes["TypeName"];
Type t = type.ReflectedType; -
不能使用
Activator.CreateInstance
或new T()
创建实例
只能通过创建ILRuntime中对象中的反射方式创建
appdomain.Instantiate
或者type.GetConstructor
后Invoke
-
-
ILRuntime热更工程中使用反射,和C#中使用反射一样
在热更工程中使用反射
按照反射的规则正常调用即可,和C#中反射没有任何区别
在Unity工程中调用反射热更工程内容
假设要反射调用下面的热更新工程内的类
1 | using System.Collections.Generic; |
我们已在创建ILRuntime中对象时接触过 Unity 反射创建 ILRuntime 中的对象,我们就使用了ILRuntime中的反射相关内容进行对象的创建
-
获取ILRuntime对应
IType
类型1
2
3
4ILRuntimeMgr.Instance.StartILRuntime(() =>
{
ILRuntimeMgr.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Main", null, null);
}); -
通过IType获取到对应的
Type
1
2
3
4
5
6ILRuntimeMgr.Instance.StartILRuntime(() =>
{
ILRuntimeMgr.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Main", null, null);
IType iType = ILRuntimeMgr.Instance.appDomain.LoadedTypes["HotFix_Project.Lesson3_Test"];
Type type = iType.ReflectionType;
}); -
通过反射获取各种内容来进行调用
-
构造函数
注意
在Unity中反射使用热更工程中类时,我们不能够使用
Activator.CreateInstance(type)
的形式去创建对象,这样会报错
想要在主工程中创建热更工程中的对象,必须使用我们之前将过的三种方式,详见:UH4L3——实例化ILRuntime中对象1
2
3
4
5
6
7
8
9ILRuntimeMgr.Instance.StartILRuntime(() =>
{
ILRuntimeMgr.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Main", null, null);
IType iType = ILRuntimeMgr.Instance.appDomain.LoadedTypes["HotFix_Project.Lesson3_Test"];
Type type = iType.ReflectionType;
object obj = type.GetConstructor(new Type[0]).Invoke(null);
print(obj);
}); -
成员变量
1
2
3
4
5
6
7
8
9
10
11ILRuntimeMgr.Instance.StartILRuntime(() =>
{
ILRuntimeMgr.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Main", null, null);
IType iType = ILRuntimeMgr.Instance.appDomain.LoadedTypes["HotFix_Project.Lesson3_Test"];
Type type = iType.ReflectionType;
object obj = type.GetConstructor(new Type[0]).Invoke(null);
print(obj);
var testIInfo = type.GetField("testI");
print(testIInfo.GetValue(obj)); //通过反射获取成员变量
}); -
成员属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14ILRuntimeMgr.Instance.StartILRuntime(() =>
{
ILRuntimeMgr.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Main", null, null);
IType iType = ILRuntimeMgr.Instance.appDomain.LoadedTypes["HotFix_Project.Lesson3_Test"];
Type type = iType.ReflectionType;
object obj = type.GetConstructor(new Type[0]).Invoke(null);
print(obj);
var testIInfo = type.GetField("testI");
print(testIInfo.GetValue(obj)); //通过反射获取成员变量
var strinfo = type.GetProperty("Str");
strinfo.SetValue(obj, "897654"); //通过反射设置成员属性
print(strinfo.GetValue(obj)); //通过反射获取成员属性
}); -
成员方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16ILRuntimeMgr.Instance.StartILRuntime(() =>
{
ILRuntimeMgr.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Main", null, null);
IType iType = ILRuntimeMgr.Instance.appDomain.LoadedTypes["HotFix_Project.Lesson3_Test"];
Type type = iType.ReflectionType;
object obj = type.GetConstructor(new Type[0]).Invoke(null);
print(obj);
var testIInfo = type.GetField("TestI");
print(testIInfo.GetValue(obj)); //通过反射获取成员变量
var strinfo = type.GetProperty("Str");
strinfo.SetValue(obj, "897654"); //通过反射设置成员属性
print(strinfo.GetValue(obj)); //通过反射获取成员属性
var methodInfo = type.GetMethod("TestFun", new Type[0]);
methodInfo.Invoke(obj, null); //通过反射调用成员方法
});
-
输出:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!