Методы, на которые ссылаются другие сборки

#c# #.net #assemblies #reference #system.reflection

#c# #.net #сборки #ссылка #system.reflection

Вопрос:

Я разрабатываю инструмент для анализа воздействия. Если я изменяю метод, скажем, «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:

Вам необходимо проанализировать весь код в этих сборках. Вы можете использовать Mono.Сесил для этой задачи.

Еще немного информации:
То, что вы пытаетесь сделать, не совсем тривиально. Вам нужно перебрать весь возможный исполняемый код, изучить инструкции 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 ;-)
            }
        }
    }
}
  

Комментарии:

1. @Daniel: Большое спасибо за ваше предложение. Я пробую это и скоро сообщу вам об этом.

2. @Daniel: С некоторыми изменениями (очень специфичными для моего запроса) это сработало. Большое спасибо. Ты потрясающий.

3. @Shwetabh: Приятно слышать! Не могли бы вы поделиться частью, которая отсутствует в моем предложении, то есть реальным анализом?

4. @Daniel: Как уже было сказано, это было очень специфично для моего требования. Чтобы вы знали: 1. Я уже перебирал все библиотеки dll (числом 100). 2. Затем с помощью моего приведенного выше кода я получаю все сборки, где ссылаются на мою сборку. 3. Как только я получу, скажем, 10 сборок, указанных выше, затем использую код, передавая directory и выбранное полное имя сборки, чтобы получить инструкции. 4. Затем в части анализа (самой сложной) Я просто ищу имя моего метода (операция со строкой). Вот и все.

5. @Shwetabh: Спасибо за обновление. Вы знаете, что это приведет к ложным срабатываниям, если в разных классах существует несколько методов с одинаковым именем?