c# - ResolveMethod() 返回完全不同的方法

标签 c# .net reflection

我正在解析 .NET DLL 中的方法,并注意到 Module.ResolveMethod() 返回的方法与原始方法完全不同。我正在指定该方法的确切 MetadataToken,所以我完全不明白为什么我最终会得到除原始方法之外的任何其他方法。

在下面的示例中,我使用了“Dispose()”方法。我获取它的元数据 token 并解析它,却发现我现在有了“OnBackColorChanged(System.EventArgs)”方法

static void Main(string[] args)
    {
        Assembly assembly = Assembly.LoadFrom(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Windows.Forms.dll");
        MethodInfo method = assembly.GetModules()[0].GetTypes()[300].GetMethods()[362];
        Console.WriteLine(method); //Returns 'Void Dispose()'

        MethodInfo method2 = (MethodInfo)assembly.GetModules()[0].ResolveMethod(method.MetadataToken);
        Console.WriteLine(method2); //Returns 'Void OnBackColorChanged(System.EventArgs)' ...why?
    }

最佳答案

Button,通过长继承链,继承自Component类,该类实现了IDisposable,具有void Dispose()方法。这是您通过

获得的方法
assembly.GetModules()[0].GetTypes()[300].GetMethods()[362];

由于此方法是在 Component 类型上声明的,它位于 System 程序集中 - 使用其元数据句柄来解析来自完全不同模块的方法也就不足为奇了(System.Windows.Forms) 导致随机结果。

如果您只想获取在此具体类型上声明的方法 - 使用 BindingFlags.DeclaredOnly:

var allMethods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

但请注意,这将只返回在 Button 上声明的方法,而不返回在任何父类型上声明的方法,即使该父类型属于同一模块也是如此。

或者 - 按模块过滤:

Assembly assembly = Assembly.LoadFrom(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Windows.Forms.dll");
var module = assembly.GetModules()[0];
var type = module.GetTypes()[300];
var allMethods = type.GetMethods().Where(c => c.Module == module).ToArray();

关于c# - ResolveMethod() 返回完全不同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49224017/

相关文章:

c# - 警告 MSB3270 : mismatch between the processor architecture of the project

C#动态编译字符串和.cs文件

c# - ActiveX 初始化 : AxHost. 状态对象

asp.net - 使用带有代码隐藏的网络表单通过反射引发事件

c# - 序列化空引用对象

c# - "Universal"控制(大致)任何类型的属性?

c# - session 变量立即为空..ASP.net Core

c# - 使用 Dapper QueryAsync 返回单个对象

c# - 通过网络服务在客户中引发事件

C# SecureString 问题