2010-09-01 48 views
1

我有一個在Microsoft .NET程序集mscorlib.dll中找到的約25種類型的列表,其中需要提取該類及其成員的IL簽名。我希望每個類型都有一個文件,每個簽名都在一行上。因此,例如,採取從程序集中提取特定IL(.NET中間語言)簽名的機制

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() } 

所以,我曾經想過四種方式完成這一點:

  • 手工切割和手工直接或通過轉儲粘貼每類簽名改成文本文件從反彙編(的mscorlib.dll)。有些類型很長,所以這可能會很乏味。如果我需要做更多的事情,這絕對不是一個好的長期解決方案。

  • 編寫一個使用Reflection的工具來嘗試獲取所有簽名。我曾經在高層次上考慮過使用類似下面的僞代碼[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 

回答

1

紅門反射器可以使剪切和粘貼走快了很多。

+0

謝謝本。我敢打賭,紅門反射器將我的時間減少了60-70%。這是一個很好的短期解決方案。 – 2010-09-02 00:57:10

1

如果您決定從IL獲取簽名,您需要編寫某種簽名解析器。 David Broman在MSDN代碼庫here上發佈了一個示例。它沒有完全的功能(特別是,你必須添加對泛型的支持),但它確實給你一個開始。

2

您可以從MethodInfo中的信息中重建方法簽名。你不需要GetMethodBody - 那裏沒有簽名信息。 MemberInfo.Name,MemberInfo.ReturnType,MemberInfo.GetParameters()等等。它就在那裏。

相關問題