6.Unity调用ILRuntime-方法调用-静态方法调用
6.1 知识点
复习启动ILRuntime
ILRuntimeManager.Instance.StartILRuntime(() =>
{
});
静态方法调用
静态方法调用概述
静态方法调用有两种方式:
直接通过
appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
调用静态方法。通过类似反射的
IMethod
调用方法:- 通过
IType
中的GetMethod
方法,类似反射一样的获取对应类中的方法。 - 2-1. 通过
appdomain.Invoke(IMethod对象, null, 参数列表)
。 - 2-2. 通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性。
using (var method = appDomain.BeginInvoke(methodName)) { method.Push.....(1000);//传入指定类型参数 method.Invoke();//执行方法 method.Read....()//获取指定类型返回值 }
- 通过
给Lesson4_Test添加静态方法,并重新生成
public static void TestStaticFun()
{
Debug.Log("无参静态方法");
}
public static int TestStaticFun2(int i)
{
Debug.Log("有参静态方法" + i);
return i + 10;
}
获取静态方法并调用
ILRuntimeManager.Instance.StartILRuntime(() =>
{
//加载完了热更新相关的dll和pdb后 再去执行热更代码
//静态方法调用有两种方式
// 1. 直接通过 appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表) 调用静态方法
AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun", null, null); //无参静态方法
int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun2", null, 99); //有参静态方法99
print(i); //109
// 2. 通过类似反射的IMethod调用方法
// 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
// 2-1. 通过appdomain.Invoke(IMethod对象, null, 参数列表)
//获取对应类 的 Itype
IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
//获取对应方法的信息
IMethod method1 = type.GetMethod("TestStaticFun", 0);
IMethod method2 = type.GetMethod("TestStaticFun2", 1);
//通过方法信息 IMethod 调用对应方法
appDomain.Invoke(method1, null, null); //无参静态方法
i = (int)appDomain.Invoke(method2, null, 88);//有参静态方法88
print(i);//98
// 2-2. 通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
// using (var method = appDomain.BeginInvoke(methodName))
// {
// method.Push.....(1000);//传入指定类型参数
// method.Invoke();//执行方法
// method.Read....()//获取指定类型返回值
// }
using (var method = appDomain.BeginInvoke(method1))
{
method.Invoke();//无参静态方法
}
using (var method = appDomain.BeginInvoke(method2))
{
method.PushInteger(77);
method.Invoke();//有参静态方法77
i = method.ReadInteger();
print(i);//有参静态方法87
}
});
总结
静态方法调用的规则和成员属性方法调用规则基本类似,有三种调用方式:
appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
appdomain.Invoke(IMethod对象, null, 参数列表)
- 无GC Alloc方式:
using BeginInvoke
,push
,invoke
,read
,ubpir
方式。
注意:
建议大家都使用类似反射的 IMethod
来调用方法,并且使用更节约性能的无GC Alloc方式来调用。
6.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
}
}
Lesson06_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 Lesson06_Unity调用ILRuntime_方法调用_静态方法调用 : MonoBehaviour
{
void Start()
{
#region 复习 启动ILRuntime
ILRuntimeManager.Instance.StartILRuntime(() =>
{
//加载完了热更新相关的dll和pdb后 再去执行热更代码
//静态方法调用有两种方式
// Appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
//1.直接通过appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
// 调用静态方法
AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun", null, null); //无参静态方法
int i = (int)appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestStaticFun2", null, 99); //有参静态方法99
print(i); //109
//2.通过类似反射的IMethod调用方法
// 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
// 2-1.通过appdomain.Invoke(IMethod对象, null, 参数列表)
//获取对应类 的 Itype
IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
//获取对应方法的信息
IMethod method1 = type.GetMethod("TestStaticFun", 0);
IMethod method2 = type.GetMethod("TestStaticFun2", 1);
//通过方法信息 IMethod 调用对应方法
appDomain.Invoke(method1, null, null); //无参静态方法
i = (int)appDomain.Invoke(method2, null, 88);//有参静态方法88
print(i);//98
// 2-2.通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
// using (var method = appDomain.BeginInvoke(methodName))
// {
// method.Push.....(1000);//传入指定类型参数
// method.Invoke();//执行方法
// method.Read....()//获取指定类型返回值
// }
using (var method = appDomain.BeginInvoke(method1))
{
method.Invoke();//无参静态方法
}
using (var method = appDomain.BeginInvoke(method2))
{
method.PushInteger(77);
method.Invoke();//有参静态方法77
i = method.ReadInteger();
print(i);//有参静态方法87
}
});
#endregion
#region 知识点 静态方法调用
//静态方法调用有两种方式
//1.直接通过appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
// 调用静态方法
//2.通过类似反射的IMethod调用方法
// 通过IType中的GetMethod方法,类似反射一样的获取对应类中的方法
// 2-1.通过appdomain.Invoke(IMethod对象, null, 参数列表)
// 2-2.通过更节约性能的无GC Alloc方式(调用完后直接回收)调用,类似上节课的成员属性
// using (var method = appDomain.BeginInvoke(methodName))
// {
// method.Push.....(1000);//传入指定类型参数
// method.Invoke();//执行方法
// method.Read....()//获取指定类型返回值
// }
#endregion
#region 总结
//静态方法调用的规则和成员属性方法调用规则基本类似
//三板斧调用
//1.appdomain.Invoke("命名空间.类名", "静态方法名", null, 参数列表)
//2.appdomain.Invoke(IMethod对象, null, 参数列表)
//3.无GC Alloc方式 using BeginInvoke push Invoke read -> ubpir方式
//注意:
//建议大家都使用类似反射的IMethod来调用方法
//并且使用更节约性能的无GC Alloc方式来调用
#endregion
}
}
6.3 练习题
请基于本节课,自己练习一下Unity跨域调用ILRuntime中的静态方法
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com