我在 Microsoft .NET 程序集 mscorlib.dll 中找到了大约 25 种类型的列表,我需要在其中提取类及其成员的 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 的转储)。有些类型很长,所以这可能会变得乏味。如果我需要做更多,这绝对不是一个好的长期解决方案。
编写一个使用反射的工具来尝试获取所有签名。我在高层次上考虑过使用下面的伪代码 [1] 之类的东西。
编写一个工具,在 ildasm 的 IL 转储上使用字符串解析来查找类型并获取签名
使用现有的工具来完成任务。
有谁知道可以帮助我完成任务的现有工具或机制?如果没有,关于制作这样一个工具的方向有什么建议吗?如果您对如何完成它有任何代码想法,我将不胜感激。
[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