2010-02-11 69 views
26

無論出於何種原因,我似乎無法獲取引用程序集中的類型列表。不僅如此,我甚至無法看到這個引用的程序集。如何獲取引用程序集中的所有類型?

我試過AppDomain.CurrentDomain.GetAssemblies(),但它只返回已經加載到內存中的程序集。我試過Assembly.GetExecutingAssembly().GetReferencedAssemblies(),但這只是返回mscorlib。

我錯過了什麼?

+1

你想檢查一個項目引用的程序集,或者某個地方坐在文件系統上的程序集? – Amy 2010-02-11 03:04:06

+1

我懷疑CLR的實現會使得從所有程序集中獲取所有類型是不可能的,因爲它們不得不在所有程序集中進行即時編譯,但我真的不是那方面的專家,所以你只應該用我的評論作爲進一步探索的線索。 – zneak 2010-02-11 03:09:04

+0

@ yodaj007引用的程序集 – AngryHacker 2010-02-11 03:15:11

回答

52

請注意,Assembly.GetReferencedAssemblies只包含特定的程序集,如果您實際在程序集中使用該程序集中的某個類型(或者您使用的類型取決於該程序集中的類型)。僅僅在Visual Studio中的引用列表中包含一個程序集是不夠的。也許這解釋了你所期望的輸出差異?我注意到如果您希望能夠使用不可能的反射來獲取Visual Studio中引用列表中的所有程序集,程序集的元數據不包含關於給定程序集不依賴於的程序集的任何信息。

這就是說,一旦你檢索到的所有引用的程序集的列表類似於下面的東西應該讓你枚舉這些組件的所有類型:

foreach (var assemblyName in Assembly.GetExecutingAssembly().GetReferencedAssemblies()) { 
    Assembly assembly = Assembly.Load(assemblyName); 
    foreach (var type in assembly.GetTypes()) { 
     Console.WriteLine(type.Name); 
    } 
} 

如果需要被引用的程序集在Visual Studio中,那麼你將不得不解析csproj文件。爲此,請查看包含Reference元素的ItemGroup元素。

最後,如果您知道程序集所在的位置,則可以使用Assembly.LoadFile加載它,然後按照上述方法進行操作,以枚舉該加載程序集中的類型。

+1

這基本上是問題的要點。在使用其中的類型之前,我的應用程序必須首先檢查引用的程序集。所以不,它在被檢查之後才被使用。 – AngryHacker 2010-02-11 03:17:10

+0

@AngryHacker:好的,我想我明白你在說什麼。請參閱我的編輯。讓我知道這個澄清是否有幫助。 – jason 2010-02-11 03:20:52

相關問題