首页 > 解决方案 > 给定一个 .NET 方法,我们如何知道该方法使用了哪些方法、类型等?

问题描述

鉴于:

  1. .NET 程序集
  2. 属于程序集内部某个类型的方法(一)

如何找到方法 (2) 引用的 .NET 类型/方法?

我意识到反思在这里没有帮助。但有什么作用?

标签: .net

解决方案


我能想到的最简单的方法是使用Mono.Cecil。您可以执行以下操作:

using System;
using System.Linq;
using Mono.Cecil;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using var a = AssemblyDefinition.ReadAssembly(typeof(Program).Assembly.Location);
            var m = a.MainModule.Types.Single(c => c.Name == "Program").Methods.Single(c => c.Name == "Main");
            foreach(var inst in m.Body.Instructions)
            {
                switch(inst.Operand)
                {
                    case TypeReference tr:
                        System.Console.WriteLine(tr.FullName);
                        break;

                    case MethodReference mr:
                        System.Console.WriteLine(mr.ReturnType.FullName);
                        System.Console.WriteLine(mr.DeclaringType.FullName);
                        // ....
                        break;

                    // other member types...
                }
            }
        }
    }
}

话虽如此,您也可以使用System.Reflection.Metadata但是,IMO,后者要复杂得多。


推荐阅读