Я вытягивал волосы, пытаясь решить это. То, что я пытаюсь сделать, должно создать 'карту' того, как объекты используются в небольшом количестве кода, я продолжаю работать. Думайте о нем как о расширенной Находке Использования. Самый легкий способ показать это примером:
public class MasterClass
{
Type1 type1;
Type2 type2;
Type3 type3;
void InitializeData()
{
type1 = new Type1(this);
type2 = new Type2(this);
type3 = new Type3(this);
}
}
public class Type1
{
private MasterClass _master;
public Type1(MasterClass master)
{
_master = master;
}
public void Something()
{
//use _master.type2 and _master.type3 here
}
}
public class Type2
{
private MasterClass _master;
public Type2(MasterClass master)
{
_master = master;
}
public void Something()
{
//use _master.type3 here
}
}
public class Type3
{
private MasterClass _master;
public Type3(MasterClass master)
{
_master = master;
}
public void Something()
{
//use _master.type1 and _master.type2 here
}
}
То, что я пытаюсь сделать, получают отображение или сообщают, что, в случае примера, дал бы что-то как:
Type1, используемый: {Type3}
Type2, используемый: {Type1, Type3}
Type3, используемый: {Type1, Type2}
Если я могу получить его в словарь затем, я дома.:-)
Что я попробовал:
Я попытался пробежаться через блоки, каждый тип, каждый метод, затем вытягивающий массивы IL и затем пытающийся проанализировать операнды без удачи. Я даже попытался пробежаться через исходные файлы с некоторыми регулярными выражениями, но у меня есть тысячи классов для осмотра, записанный в нескольких различных стилях, что означает, что я буду, пропустил некоторые ссылки.
Я могу использовать Отражатель && / || Resharper для получения единственной ссылки за один раз, но я хотел бы получить их внезапно.
Какие-либо предложения?
Это нелегко. Вам нужно будет получить экземпляр MethodInfo, PropertyInfo, FieldInfo и т.д. для всех следующих:
Затем вам нужно будет разобрать IL и вызвать экземпляр ResolveMethod на экземпляре Module, в котором находится исследуемый тип, и посмотреть, соответствует ли этот экземпляр событию МетодInfo для вашего метода, который вы пытаетесь определить использование.
EDIT:
Как и "Найти все ссылки" в Visual Studio, в нем будут найдены только прямые прямые ссылки. Если вы также хотите найти косвенные ссылки (ex: method1 references method2, и method2 references method3 - вы хотите увидеть, что есть связь между method1 и method3), то это нужно сделать с помощью рекурсии.
.Я предлагаю использовать для этого NDepend , так как это приспособлено к описываемой вами проблеме. Сделать это в коде будет достаточно много работы.
Если вы просто ищете инструмент, то рефлектор может сделать это с помощью некоторых дополнений.
Здесь вы найдете широкий спектр дополнений: http://reflectoraddins.codeplex.com/
Некоторые плагины типа FileGenerator могут копировать вывод рефлектора непосредственно в файл.
] Попробуйте [] Jb Evain[] [] CILReader[] или [] Cecil[][
]. [] Он упоминает хорошее решение проблемы симиляра [] здесь [] [
].