我正在开发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并且会受到影响。
任何帮助将不胜感激
答案 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 ;-)
}
}
}
}