我正在解析 .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/