簡體   English   中英

獲取所有引用程序集的路徑

[英]Get the paths of all referenced assemblies

如何獲取當前正在執行的程序集引用的所有程序集的路徑? GetReferencedAssmblies()為我提供了AssemblyName[] 我如何從那里到達它們的裝載位置?

在裝配程序之前,您無法知道。 裝配分辨率算法很復雜,您無法可靠地預測它將做什么。 調用Assembly.Load(AssemblyName)覆蓋將為您提供對程序集的引用,其Location屬性將告訴您所需的內容。

但是,您真的不希望在JIT編譯器執行之前預先加載程序集。 這是低效的,問題的可能性不是零。 例如,您可以在程序准備好響應之前觸發AppDomain.AssemblyResolve事件。 避免問這個問題。

按照Hans Passant的回答,由於CodeBase屬性總是包含null ,我想出了這個。 它可能找不到所有程序集,因為它們可能並非都已加載。 在我的情況下,我必須找到以前加載的程序集的所有引用,所以它運行良好:

IEnumerable<string> GetAssemblyFiles(Assembly assembly)
{
    var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
    return assembly.GetReferencedAssemblies()
        .Select(name => loadedAssemblies.SingleOrDefault(a => a.FullName == name.FullName)?.Location)
        .Where(l => l != null);
}

用法:

var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly);

CodeBase屬性應提供完整路徑名。

您可以像這樣獲取程序集的URL位置:

Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase

暫無
暫無

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

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