首页
社区
课程
招聘
Unity如何反射获得泛型函数的地址?
wx_嗨 2022-12-21 1089

例如:
public sealed class Action<T> : MulticastDelegate
public virtual void Invoke(T obj) { }
利用Il2cppDumper可以获得具体类型的函数地址
|-RVA: 0x3A25D14 Offset: 0x3A25D14 VA: 0x3A25D14
|-Action<bool>.Invoke
但是利用il2cpp_class_get_method_from_name获取Action`1中的Invoke函数获取不到0x3A25D14 这个偏移。
查询相关资料,发现可以用函数MakeGenericMethod获取
public virtual MethodInfo MakeGenericMethod(Type[] typeArguments) { }
但是该函数的参数位Type[],我通过Assembly_GetType("System.Boolean")获取Type,调用MakeGenericMethod失败,构造Array调用也失败,请问要如何构造这个参数,完成Action<bool>.Invoke函数地址的获取?或者是否有更好方法能够字节得到Action<bool>.Invoke的函数地址?

收藏
1条回答
Niceto 2022-12-26

在 Unity 中,你可以使用 System.Reflection 命名空间中的 MethodInfo 类来获取泛型函数的地址。

 

下面是一个例子,展示了如何使用反射获取泛型函数的地址:

段落引用
插入代码using System.Reflection;

 

// 假设有一个泛型函数:
void MyGenericFunction<T>(T arg) { }

 

// 使用反射获取泛型函数的地址
MethodInfo method = typeof(MyClass).GetMethod("MyGenericFunction");

 

// 获取泛型函数的类型参数列表
Type[] typeArguments = method.GetGenericArguments();

 

// 使用 MakeGenericMethod 方法创建泛型函数的实例
MethodInfo genericMethod = method.MakeGenericMethod(typeof(int));

 

在这个例子中,我们使用 Type.GetMethod 方法获取泛型函数的 MethodInfo 对象,然后使用 MethodInfo.GetGenericArguments 方法获取泛型函数的类型参数列表,最后使用 MethodInfo.MakeGenericMethod 方法创建泛型函数的实例。

回复