7.Unity调用ILRuntime-方法调用-成员方法调用
7.1 知识点
成员方法调用
成员方法调用概述
成员方法调用和静态方法调用几乎一样,区别在于需要先创建对象,将对象传入之前为null的地方。
- 直接通过
appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表)
调用方法。 - 通过类似反射的
IMethod
调用方法:- 通过
IType
中的GetMethod
方法,类似反射一样的获取对应类中的方法。 - 2-1. 通过
appdomain.Invoke(IMethod对象, 类对象, 参数列表)
。 - 2-2. 通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性。
- 通过
给Lesson4_Test添加成员方法并重新生成
public void TestFun()
{
Debug.Log("无参无返回值 成员方法调用");
}
public int TestFun2(int i)
{
Debug.Log("有参有返回值 成员方法调用");
return 10 + i;
}
获取成员方法并调用
ILRuntimeManager.Instance.StartILRuntime(() =>
{
AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
// 得到IType,通过它实例化一个指定的热更新工程中的类对象 (Lesson4_Test)
IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
object obj = ((ILType)type).Instantiate(); // 实例化Lesson4_Test对象
// 成员方法调用和静态方法调用几乎一样
// 区别就是需要先创建对象,将对象传入之前为null的地方
// 1. 直接通过appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表)
appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, null); // 无参无返回值 成员方法调用
int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun2", obj, 99); // 有参有返回值 成员方法调用
print(i); // 109
// 2. 通过类似反射的IMethod调用方法
// 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
// 得到对应方法的方法信息
IMethod method1 = type.GetMethod("TestFun", 0);
IMethod method2 = type.GetMethod("TestFun2", 1);
// 2-1. 通过appdomain.Invoke(IMethod对象, 类对象, 参数列表)
appDomain.Invoke(method1, obj); // 无参无返回值 成员方法调用
i = (int)appDomain.Invoke(method2, obj, 88); // 有参有返回值 成员方法调用
print(i); // 98
// 2-2. 通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
using (var method = appDomain.BeginInvoke(method1))
{
method.PushObject(obj);
method.Invoke(); // 无参无返回值 成员方法调用
}
using (var method = appDomain.BeginInvoke(method2))
{
method.PushObject(obj);
method.PushInteger(77);
method.Invoke(); // 有参有返回值 成员方法调用
i = method.ReadInteger();
print(i); // 87
}
});
总结
成员方法调用和静态方法调用区别在于,需要指明调用方法的对象。
三板斧调用:
appdomain.Invoke("命名空间.类名", "静态方法名", 对象, 参数列表)
appdomain.Invoke(IMethod对象, 对象, 参数列表)
- 无GC Alloc方式:
using BeginInvoke
,push
,invoke
,read
,ubpir
方式。
7.2 知识点代码
Lesson4_Test
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace HotFix_Project
{
class Lesson4_Test
{
#region 成员变量
private string str;
#endregion
#region 成员属性
public string Str
{
get
{
return str;
}
set
{
str = value;
}
}
#endregion
#region 构造函数
public Lesson4_Test()
{
}
public Lesson4_Test(string str)
{
this.str = str;
}
#endregion
#region 静态方法
public static void TestStaticFun()
{
Debug.Log("无参静态方法");
}
public static int TestStaticFun2(int i)
{
Debug.Log("有参静态方法" + i);
return i + 10;
}
#endregion
#region 成员方法
public void TestFun()
{
Debug.Log("无参无返回值 成员方法调用");
}
public int TestFun2(int i)
{
Debug.Log("有参有返回值 成员方法调用");
return 10 + i;
}
#endregion
}
}
Lesson07_Unity调用ILRuntime_方法调用_成员方法调用
using ILRuntime.CLR.Method;
using ILRuntime.CLR.TypeSystem;
using ILRuntime.Runtime.Enviorment;
using System.Collections;
using System.Collections.Generic;
using BaseFramework;
using UnityEngine;
public class Lesson07_Unity调用ILRuntime_方法调用_成员方法调用 : MonoBehaviour
{
void Start()
{
#region 复习 启动ILRuntime 创建类对象
ILRuntimeManager.Instance.StartILRuntime(() =>
{
AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
//得到IType 通过他实例化一个指定的热更新工程中的类对象 (Lesson4_Test)
IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
object obj = ((ILType)type).Instantiate();//实例化Lesson4_Test对象
//成员方法调用和静态方法调用几乎一样
//区别就是需要先创建对象,将对象传入之前为null的地方
//1.直接通过appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表)
appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, null);//无参无返回值 成员方法调用
int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun2", obj, 99);//有参有返回值 成员方法调用
print(i);//109
//2.通过类似反射的IMethod调用方法
// 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
//得到对应方法的方法信息
IMethod method1 = type.GetMethod("TestFun", 0);
IMethod method2 = type.GetMethod("TestFun2", 1);
// 2-1.通过appdomain.Invoke(IMethod对象, 类对象, 参数列表)
appDomain.Invoke(method1, obj);//无参无返回值 成员方法调用
i = (int)appDomain.Invoke(method2, obj, 88);//有参有返回值 成员方法调用
print(i);//98
// 2-2.通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
using (var method = appDomain.BeginInvoke(method1))
{
method.PushObject(obj);
method.Invoke();//无参无返回值 成员方法调用
}
using (var method = appDomain.BeginInvoke(method2))
{
method.PushObject(obj);
method.PushInteger(77);
method.Invoke();//有参有返回值 成员方法调用
i = method.ReadInteger();
print(i);//87
}
});
#endregion
#region 知识点 成员方法调用
//成员方法调用和静态方法调用几乎一样
//区别就是需要先创建对象,将对象传入之前为null的地方
//1.直接通过appdomain.Invoke("命名空间.类名", "方法名", 类对象, 参数列表)
//2.通过类似反射的IMethod调用方法
// 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
// 2-1.通过appdomain.Invoke(IMethod对象, 类对象, 参数列表)
// 2-2.通过更节约性能的GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
#endregion
#region 总结
//三板斧调用(和静态方法调用区别就是,需要指明调用方法的对象)
//1.appdomain.Invoke("命名空间.类名", "静态方法名", 对象, 参数列表)
//2.appdomain.Invoke(IMethod对象, 对象, 参数列表)
//3.无GC Alloc方式 using BeginInvoke push Invoke read -> ubpir方式
#endregion
}
}
7.3 练习题
练习一下Unity跨域调用ILRuntime中的成员方法
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com