Посмотрите на Моно Сесил.
Эта библиотека имеет возможность «отражать» (не очень удачное название для этого) фактическое изображение сборки для проведения анализа.Это предполагает, что вы захотите скомпилировать в «большую» сборку, чтобы запустить анализ зависимостей с помощью Mono.Cecil.
Редактировать На самом деле вы можете простоиспользуйте Сесил, чтобы скопировать «большую» сборку, отфильтровывая ее части.Таким образом, у вас не будет большой сложности компиляции отдельных сборок;Посмотрите на пример CecilRoundtrip для примера того, как выполнить циклическое ( чтение -> манипулирование -> сохранить ) сборок в Cecil.
Ранее я опубликовал довольно обширные примеры использования Mono Cecil для «расширенных» поисков (по сути, статического поиска по дереву вызовов):
Абсолютный абсолютный минимум, который был бы наиболее полезным для вас, вероятно, будет следующим:
var types = assemblies
.SelectMany(assembly => assembly.MainModule.Types.Cast<TypeDefinition>());
var dependencies = types.ToDictionary(
key => key,
typedef => new HashSet<string>(typedef.Methods.Cast<MethodDefinition>()
.Where(method => null != method.Body) // ignore abstracts and generics
.SelectMany(method => method.Body.Instructions.Cast<Instruction>())
.Select(instr => instr.Operand)
.OfType<TypeReference>().Distinct()
// .Where(type => !type.Namespace.StartsWith("System"))
.Select(type => type.Name)));
foreach (var entry in dependencies)
{
Console.WriteLine("{0}\t{1}", entry.Key.Name, string.Join(", ", entry.Value.ToArray()));
}
Примечание закомментированная строка дополнительно отфильтровывает вещи из каркаса (System.String
, System.Char
и т.тип.Чтобы перечислить используемые типы, просто пометьте в поиске имя сборки:
.Select(type => type.Module.Assembly.Name.Name)));
Пример вывода первого типа (типы требуются):
SegmentSoortKenmerk SegmentSoortKenmerk
OperatorValue
Koppelpad Koppelpad, CodeLeidendVolgend
RedenWaarschuwing
RelExceptions
GecontroleerdDocument GecontroleerdDocument, GecontroleerdDocument[]
OwiExtraKenmerk OwiExtraKenmerk, Gegeven, BackofficeRelatie
Entiteit Entiteit, SleutelSysteemObject[], EniteitType
Аналогичный запрос, но с использованием имени сборкипоиск:
SegmentSoortKenmerk Lspo.Business
OperatorValue
Koppelpad Lspo.Business
RedenWaarschuwing
RelExceptions
GecontroleerdDocument Lspo.Business
OwiExtraKenmerk Lspo.Business
Entiteit Lspo.Business