2011-11-10 58 views
3

我想從我的程序集中獲取所有類型,但我沒有參考,也不關心它們。找到接口類型與參考有什麼關係?有沒有辦法讓我解決這個問題?爲什麼Assembly.GetTypes()需要引用?

Assembly assembly = Assembly.LoadFrom(myAssemblyPath); 
Type[] typeArray = assembly.GetTypes(); 

拋出: FileNotFoundException異常 無法加載文件或程序集「部分引用的程序集」或它的一個依賴。該系統找不到指定的文件。

+0

是myAssembly的文件名嗎? –

+0

@competent_tech這是文件路徑。 – Peter

回答

4

加載程序集時還需要加載其所有依賴項,因爲程序集中的代碼可以在加載後執行(沒關係,你實際上沒有運行任何東西,只能反思它)。

要加載程序集以明確反思它,您需要使用例如load it into the reflection-only contextReflectionOnlyLoadFrom。這並不需要加載任何引用的程序集,但是這樣你就無法運行代碼,反射會比你有時候習慣的更笨拙。

+0

+1僅用於反射上下文;我忘記了這一點。 – phoog

+3

聽起來不錯,但我得到這個:不能解決依賴到程序集'refAssmbly',因爲它沒有被預加載。在使用ReflectionOnly API時,必須通過ReflectionOnlyAssemblyResolve事件按需預加載或加載相關程序集。我基本上只是想看看它,爲什麼這些引用需要解決? – Peter

0

爲了加載程序集,需要加載程序集的依賴關係。例如,如果您的程序集包含返回XmlNode的類型,那麼您將不得不加載System.Xml.dll

1

它似乎是Get Types defined in an assembly only重複,其中,所述溶液爲:

public static Type[] GetTypesLoaded(Assembly assembly) 
{ 
    Type[] types; 
    try 
    { 
     types = assembly.GetTypes(); 
    } 
    catch (ReflectionTypeLoadException e) 
    { 
     types = e.Types.Where(t => t != null).ToArray(); 
    } 

    return types;  
} 
0

使用反射唯一上下文可能由JB Evain它也可via NuGetMono.Cecil一種替代。

ModuleDefinition module = ModuleDefinition.ReadModule(myAssemblyPath); 
Collection<TypeDefinition> types = module.Types;