7 .net c# mono.cecil
我想列出从特定方法调用的所有方法.例如,如果我有以下代码:
public void test1() {
test2();
test3();
}
Run Code Online (Sandbox Code Playgroud)
该列表应包含test2()和test3().如果可以列出相同类的方法以及另一个类的方法,那将是很好的.
另外,我想找到一种方法来检测方法使用哪些字段:
public class A {
private String test1 = "";
private String test2 = "";
public void test() {
Console.WriteLine(test1);
}
}
Run Code Online (Sandbox Code Playgroud)
因此应该列出test1.
我尝试使用Mono.Cecil,但遗憾的是我找不到关于该项目的大量文档.那么有人知道怎么做吗?
编辑:我想用Mono.Cecil来做,因为通过它的API我可以直接在我的应用程序中使用结果.如果我在Visual Studio或类似工具中使用内置工具,则很难处理结果.
Kri*_*is 7
我没有真正使用Cecil但是HowTo页面显示了如何枚举类型,你的问题似乎只需要循环你的后续指令:Call和Load Field.这个示例代码似乎处理了您提到的案例,但可能还有更多,您应该检查其他调用说明.如果您使其递归,请确保跟踪已经检查过的方法.
static void Main(string[] args)
{
var module = ModuleDefinition.ReadModule("CecilTest.exe");
var type = module.Types.First(x => x.Name == "A");
var method = type.Methods.First(x => x.Name == "test");
PrintMethods(method);
PrintFields(method);
Console.ReadLine();
}
public static void PrintMethods(MethodDefinition method)
{
Console.WriteLine(method.Name);
foreach (var instruction in method.Body.Instructions)
{
if (instruction.OpCode == OpCodes.Call)
{
MethodReference methodCall = instruction.Operand as MethodReference;
if(methodCall != null)
Console.WriteLine("\t" + methodCall.Name);
}
}
}
public static void PrintFields(MethodDefinition method)
{
Console.WriteLine(method.Name);
foreach (var instruction in method.Body.Instructions)
{
if (instruction.OpCode == OpCodes.Ldfld)
{
FieldReference field = instruction.Operand as FieldReference;
if (field != null)
Console.WriteLine("\t" + field.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
仅使用 C# 中的反射 API 无法完成此操作。实际上,您需要解析原始源代码,这可能不是您正在寻找的解决方案。但是,例如,这就是 Visual Studio 获取此类信息以进行重构的方式。
您可能会在某个地方分析 IL - 沿着 Reflector 所做的事情,但我认为这将是一项艰巨的工作。
| 归档时间: |
|
| 查看次数: |
2644 次 |
| 最近记录: |