#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: Спасибо за обновление. Вы знаете, что это приведет к ложным срабатываниям, если в разных классах существует несколько методов с одинаковым именем?