1

我在 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
4

3 回答 3

2

您可以从 MethodInfo 中找到的信息重建方法签名。您不需要 GetMethodBody - 那里没有签名信息。MemberInfo.Name、MemberInfo.ReturnType、MemberInfo.GetParameters() 等。它都在那里。

于 2010-09-01T23:32:25.567 回答
1

红色门反射器可以使剪切和粘贴更快。

于 2010-09-01T23:25:01.317 回答
1

如果您决定从 IL 获取签名,则需要编写某种签名解析器。David Broman 在此处的 MSDN 代码库上发布了一个示例。它的功能并不完全(具体来说,您必须添加对泛型的支持),但它确实让您领先一步。

于 2010-09-01T23:31:13.390 回答