其他程序集引用的方法

时间:2011-05-04 11:55:58

标签: c# .net assemblies reference system.reflection

我正在开发Impact Analysis的工具。如果我在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并且会受到影响。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分: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 ;-)
            }
        }
    }
}