首页 > 解决方案 > 如何使用 System.Reflection.Metadata 分析 .NET 代码?

问题描述

下面是使用 Mono.Cecil 的代码,它为给定的程序集映射了程序集方法之间的所有依赖关系:

var methodsCallingMe = new Dictionary<MethodDefinition, IList<MethodDefinition>>();
var methodsCalledByMe = new Dictionary<MethodDefinition, IList<MethodDefinition>>();
foreach (var me in asmDef.MainModule.Types.SelectMany(t => t.Methods).Where(m => m.HasBody))
{
    var methodsCalled = new List<MethodDefinition>();

    foreach (var called in me.Body.Instructions
        .Select(i => i.Operand as MethodReference)
        .Where(m => m?.DeclaringType.Scope == asmDef.MainModule)
        .Select(m => m.Resolve()))
    {
        methodsCalled.Add(called);

        if (!methodsCallingMe.TryGetValue(called, out var methodsCalling))
        {
            methodsCallingMe[called] = methodsCalling = new List<MethodDefinition>();
        }
        methodsCalling.Add(me);
    }

    if (methodsCalled.Count > 0)
    {
        methodsCalledByMe[me] = methodsCalled;
    }
}

简单明了。

我一定很愚蠢,因为我无法弄清楚如何使用 System.Reflection.Metadata 来做同样的事情。我最多的是这个:

using (var peReader = new PEReader(File.OpenRead(targetPath)))
{
    var reader = peReader.GetMetadataReader();
    foreach (var method in reader.MethodDefinitions.Select(reader.GetMethodDefinition))
    {
        // I guess something about reader.GetMethodImplementation, but what?
    }
}

标签: c#.netcode-analysis

解决方案


推荐阅读