2012-04-23 33 views
13

我有以下的方法應該獲取的加載本地(在bin文件夾)組件列表:不是所有的組件都被加載到AppDomain中bin文件夾

static IEnumerable<Assembly> GetLocalAssemblies() 
    { 
     Assembly callingAssembly = Assembly.GetCallingAssembly(); 
     string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath; 

     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList(); 
    } 

但是,組件列表中缺少我需要它的幾個組件。我需要的程序集是被管理的(c#.net 4),在項目中被引用,並存在於bin文件夾中。

爲什麼二進制文件中存在的bin文件夾不掃,進入應用程序啓動時的AppDomain中?

+0

出於好奇,什麼是路徑字符串的值? – 2012-04-23 17:01:36

+0

這是該項目的bin文件夾的路徑。 – 2012-04-23 17:12:20

回答

24

Adil有它,但更詳細:

.NET CLR使用即時編譯。除此之外,這意味着它在首次使用時加載程序集。因此,儘管程序集正在使用程序集引用,但如果CLR尚未執行程序所需的引用,它們不會被加載,因此不會出現在當前AppDomain中的程序集列表中。

另一件可能適用或不適用的問題是,如果您在GAC中具有相同版本的程序集,則CLR將優先於本地程序集使用GAC,除非在DEVPATH環境中指定了這些程序集的路徑變量。如果是這種情況,並且CLR使用任何「缺失」程序集的GAC副本,則它們將具有不同的CodeBase值,並且不會顯示在您的Linq查詢結果中。其他

一兩件事:你可能要考慮使用位置屬性,而不是將codebase屬性。 Location屬性包含在運行時加載的程序集的絕對路徑。 CodeBase屬性稍有不同,並且對於完整構建項目中的所有組件都可能不同。

+0

+1位置屬性。 – Turbot 2012-04-23 17:14:25

+1

+1「如果CLR不需要引用,它們將不會出現在當前AppDomain的程序集列表中。」<---唉。這是一個殺死我的bug的根本問題。 – jwatts1980 2017-01-24 19:17:06

4

的CurrentDomain.GetAssemblies()只返回加載的程序集不它們是在執行文件夾中提供的所有組件。

這就是微軟說些什麼「GetAssemblies方法來獲取已加載到應用程序域的所有組件的列表。」 click here

3

嘗試啓動任何類在這些缺少組件,然後再次運行代碼..只在需要時與第一次調用與該組件的任何程序集加載。

相關問題