簡體   English   中英

並非所有程序集都從 bin 文件夾加載到 AppDomain

[英]Not all assemblies are being loaded into AppDomain from the bin folder

我有以下方法應該檢索加載的本地(在 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 中?

Adil 有,但更詳細:

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

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

另一件事:您可能需要考慮使用 Location 屬性而不是 CodeBase 屬性。 Location 屬性包含在運行時加載的程序集的絕對路徑。 CodeBase 屬性略有不同,並且對於項目的完整版本中的所有程序集可能並不相同。

CurrentDomain.GetAssemblies()僅返回加載的程序集,而不是執行文件夾中可用的所有程序集。

這就是微軟所說的“GetAssemblies 方法來獲取已加載到應用程序域中的所有程序集的列表”。 參考

嘗試在這些缺少的程序集中啟動任何類,然后再次運行您的代碼。只有在第一次調用與該程序集相關的任何內容時,才在需要時加載程序集。

如果您可以控制引用程序集中的代碼,我建議您創建一個在程序開始時執行的虛擬方法,這將使程序集加載到 CLR 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM