0

我正在开发一个影响分析工具。如果我在 myAssembly 中更改一个方法说“myMethod”,我需要获取所有其他引用 myAssembly 的程序集,并通过下面的代码得到它。

Assembly a = Assembly.LoadFrom("otherAssembly");
//check if the my Assembly is referenced or not?
if (a.GetReferencedAssemblies().Where(item => item.Name == "myAssembly").LongCount() > 0)
{
    //Do something
}

但是在这里我怎么知道“myAssembly”的“myMethod”是否被调用/使用?否则,我将获得所有其他引用 myAssembly 的程序集(例如 10 个),但在 10 个中只有 1 个被调用/使用 myMethod 并且会受到影响。

任何帮助将不胜感激

4

1 回答 1

2

您需要分析这些程序集中的所有代码。您可以使用Mono.Cecil来完成此任务。

更多信息:
您尝试做的事情并非微不足道。您需要遍历所有可能的可执行代码并检查 CIL 指令并分析它们以查看您的方法是否被调用。
作为起点,您可以获得所有方法的说明,如下所示:

var assemblyResolver = new DefaultAssemblyResolver();
assemblyResolver.AddSearchDirectory(...);
var assemblyDefinition = assemblyResolver.Resolve(
                             AssemblyNameReference.Parse(fullName));
foreach(ModuleDefinition module in assemblyDefinition)
{
    foreach(TypeDefinition type in module.Types)
    {
        foreach(MethodDefinition method in type.Methods)
        {
            foreach(Instruction instruction in method.Body.Instructions)
            {
                // Analyze it - the hard part ;-)
            }
        }
    }
}
于 2011-05-04T12:00:46.713 回答