2016-11-17 22 views
0

假設我們有BaseDerived,分別在Base.dllDerived.dll中定義。 DerivedBase導出(可能不是一個直接的子類,但是)如何在不使用反射的情況下檢查.NET程序集

眼下的問題是,如果我們手頭有Derived.dllBase.dll丟失,如何以編程方式檢查所有類型Derived?例如知道什麼類型可供選擇,它們的可訪問性,繼承關係等

根據我的理解,反射(在System.Reflection命名空間的東西)是不是一個不錯的選擇,因爲GetTypes()會嘗試加載Base.dll這是不可用,從而拋出ReflectionTypeLoadException

特別是,這是可以使用Roslyn或一些好的庫容易實現的東西嗎?

+0

我想這是不可能的。 .NET程序集不直接實現基類的類型以支持多態性。 –

+2

您可能必須爲此使用Mono.Cecil。 Roslyn是編譯器,不是元數據閱讀器(但它必須讀取元數據才能編譯)。你將無法解決所有的關係?如果有一個由基類實現的接口會怎麼樣?您沒有該類型信息,因爲程序集不可用。 –

+0

也許這個線程可能會幫助你:http://stackoverflow.com/questions/2646707/something-better-than-net-reflector –

回答

1

爲了研究.NET程序集(類型,方法等),您需要從元數據中獲取它。 Roslyn它不是你正在尋找的。

雖然這不完全正確,但因爲Roslyn有兩種關於您的代碼的信息,一種是節點和令牌,另一種是符號。第一個不知道關係信息,但第二個知道。

無論如何,你可以以多種方式做到這一點。我會寫兩個。

  1. 使用Mono.Cecil打開您的程序集,獲取主要模塊並調查任何你想要的。

var allTypesDefinitaion = MduleDefinition.ReadModule(assemblyPath).Types;

  • 使用工具,如CFF Explorer調查相關的元數據表。 (TypeDef \ Ref)
  • 相關問題