Механизм извлечения определенных подписей IL (.NET Intermediate Language) из сборки - PullRequest
1 голос
/ 02 сентября 2010

У меня есть список из примерно 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

Ответы [ 3 ]

2 голосов
/ 02 сентября 2010

Вы можете восстановить сигнатуру метода из информации, найденной в MethodInfo.Вам не нужен GetMethodBody - там нет информации о подписи.MemberInfo.Name, MemberInfo.ReturnType, MemberInfo.GetParameters () и т. Д. Все это есть.

1 голос
/ 02 сентября 2010

Если вы решите получить подпись от IL, вам нужно будет написать какой-нибудь синтаксический анализатор подписи.У Дэвида Бромана есть пример, размещенный в галерее кодов MSDN здесь .Он не полностью функционален (в частности, вам нужно будет добавить поддержку обобщений), но он дает вам преимущество.

1 голос
/ 02 сентября 2010

Отражатель красного затвора может ускорить процесс вырезания и вставки.

...