C#反射并找到所有引用

use*_*667 37 c# reflection reflector reference

给定一个DLL文件,我希望能够找到该DLL文件中所有方法的调用.我怎样才能做到这一点?

从本质上讲,我如何以编程方式执行Visual Studio已经执行的操作?

我不想使用像.NET Reflector这样的工具来做到这一点,但反射很好,可能是必要的.

Eli*_*ing 49

要找出使用方法的MyClass.Foo()位置,必须分析所有包含对包含的程序集的引用的程序集的所有类MyClass.我写了一个关于代码如何看起来的简单概念证明.在我的例子中,我使用由Jb Evain编写的这个库(它只是一个.cs文件):

我写了一个小测试类来分析:

public class TestClass
{
    public void Test()
    {
        Console.WriteLine("Test");
        Console.Write(10);
        DateTime date = DateTime.Now;
        Console.WriteLine(date);
    }
}
Run Code Online (Sandbox Code Playgroud)

我写了这段代码来打印出以下所用的所有方法TestClass.Test():

MethodBase methodBase = typeof(TestClass).GetMethod("Test");
var instructions = MethodBodyReader.GetInstructions(methodBase);

foreach (Instruction instruction in instructions)
{
    MethodInfo methodInfo = instruction.Operand as MethodInfo;

    if(methodInfo != null)
    {
        Type type = methodInfo.DeclaringType;
        ParameterInfo[] parameters = methodInfo.GetParameters();

        Console.WriteLine("{0}.{1}({2});",
            type.FullName,
            methodInfo.Name,
            String.Join(", ", parameters.Select(p => p.ParameterType.FullName + " " + p.Name).ToArray())
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下输出:

System.Console.WriteLine(System.String value);
System.Console.Write(System.Int32 value);
System.DateTime.get_Now();
System.Console.WriteLine(System.Object value);
Run Code Online (Sandbox Code Playgroud)

这个例子显然远未完成,因为它不处理ref和out参数,并且它不处理泛型参数.我确信忘记了其他细节.它只是表明它可以完成.

  • Nuget 替代 `MethodBodyReader`:nuget 包 **mono.reflection** 带有 `var instructions = Disassembler.GetInstructions(methodBase);` (2认同)

Dar*_*rov 5

您可以查看 MSDN 杂志文章确定 .NET 程序集和方法引用