c# - 如何使用 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?
}
}
解决方案
推荐阅读
- python - python - 通过特定其他属性比较对象属性的最佳方法
- google-app-maker - 从外部用户获取数据的想法?
- filter - Cognos 10.2 在 Framework Manager 中创建预定义过滤器
- html - 如何请求一个带有 % 的 url 而不是 %25?
- amazon-web-services - Cloudformation 堆栈在执行所有用户数据之前显示为已完成
- c# - SQL Server (getutcdate()) 在外部 POST 上插入默认值
- javascript - 如何从nodejs中的node_modules文件夹访问公用文件夹中的包?
- asp.net-mvc - asp.net OwinContext 身份验证
- intershop - ISML isDefined() 返回 false altough 对象在字段中包含值
- nginx - 带有 3rd 方应用程序的 NGINX 反向代理