Методы, на которые ссылаются другие сборки - PullRequest
0 голосов
/ 04 мая 2011

Я разрабатываю инструмент для анализа воздействия. Если я изменяю метод скажем «myMethod» в myAssembly, мне нужно получить все остальные сборки, ссылающиеся на 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
}

Но здесь Как я могу узнать, вызван / используется myMethod из myAssembly или нет? В противном случае я получу все другие сборки, которые ссылаются на myAssembly (скажем, 10 в числе), но из 10 только 1 называется / используется myMethod и будет затронут.

Любая помощь будет оценена

1 Ответ

2 голосов
/ 04 мая 2011

Вам необходимо проанализировать весь код в этих сборках.Для этой задачи вы можете использовать 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 ;-)
            }
        }
    }
}
...