У меня есть список из примерно 25 типов, найденных в сборке Microsoft .NET mscorlib.dll, где мне нужно извлечь сигнатуры IL класса и его членов. Я хочу один файл для каждого типа, с каждой подписью в одной строке. Так, например, возьмем тип
System.Collections.Generic.Comparer<T>
Я хочу извлечь следующее из сборки для этого типа (есть некоторые закрытые элементы, которые мне не понадобятся, но я могу обработать это вручную, если это необходимо).
.class public abstract auto ansi serializable beforefieldinit System.Collections.Generic.Comparer`1<T> extends System.Object implements System.Collections.IComparer, class System.Collections.Generic.IComparer`1<!T>
.method family hidebysig specialname rtspecialname instance void .ctor() cil managed
.method public hidebysig newslot abstract virtual instance int32 Compare(!T x, !T y) cil managed
.method private hidebysig newslot virtual final instance int32 System.Collections.IComparer.Compare(object x, object y) cil managed
.property class System.Collections.Generic.Comparer`1<!T> Default() { .get class System.Collections.Generic.Comparer`1<!T> System.Collections.Generic.Comparer`1::get_Default() }
Итак, я подумал о четырех способах достижения этой цели:
Вручную вырезайте и вставляйте каждую подпись каждого типа вручную в текстовые файлы из ildasm (напрямую или через дамп mscorlib.dll). Некоторые из типов довольно длинные, поэтому это может быть утомительным. И это определенно не хорошее долгосрочное решение, если мне нужно сделать больше.
Напишите инструмент, который использует Reflection, чтобы попытаться получить все подписи. На высоком уровне я думал об использовании чего-то вроде псевдо-кода [1] ниже.
Напишите инструмент, который использует разбор строк в дампе IL ildasm для поиска типов и получения подписей
Используйте уже существующий инструмент для выполнения задачи.
Кто-нибудь знает о существующем инструменте или механизме, который может помочь мне выполнить мою задачу? Если нет, какие-либо предложения, в каком направлении идти, чтобы сделать такой инструмент? И если у вас есть идеи кода о том, как это сделать, я был бы рад услышать их.
[1]
System.Reflection.GetType(string)
Type.GetMethods() For each item in
MethodInfo, GetMethodBody()
GetILAsByteArray().ToString()
Determine a way to get just the signature from the IL