簡體   English   中英

列出所有從GAC實現特定接口的DLL

[英]List all DLL's implementing a specific interface from the GAC

阿羅哈

給定具有存儲在GAC中的插件的插件體系結構(C#/ .NET 3.5),我如何列出/加載包含實現特定接口類型的所有dll? 換句話說,我想通過查看GAC來研究將我的應用程序的哪些插件安裝在計算機上。

-江戶

為了增加BFree的答案,我建議您可以僅將組件加載為反射 如果沒有appdomain,這將為您提供增強的安全性(程序集根本無法執行)和靈活性(您可以加載用於不同體系結構的程序集)。

Gac實際上只是您計算機上的任何其他目錄。 以下是典型的細分:

c:\windows\assembly\GAC

                   \GAC_32

                   \GAC_MSIL

也許還有其他..

在每個這些文件夾中,您會找到存儲實際dll的子文件夾。 首先,您需要編寫一個遞歸方法,以便在\\ assembly \\下找到所有dll(如果您不滿意自己可以輕松地在網上找到這些dll)。 一旦有了該dll的列表,就可以繼續使用Assembly.LoadFile加載程序集並檢查所有類型以查看它們是否實現了給定的接口。

我唯一的建議是將這些dll加載到單獨的appdomain中,以使您不允許將任何潛在的有害dll加載到您的應用中。

一些鏈接:

搜索目錄。

加載程序集並檢查給定的接口。

創建新的AppDomain。

首先要澄清一下:DLL無法實現接口。 DLL包含可以實現特定接口的類型。 這是一個圍繞Fusion.dll的.NET包裝器 ,可讓您枚舉GAC中的所有程序集。 Assembly.Load加載程序集后,您可以嘗試查找實現特定接口的所有類型:

foreach (var type in assembly.GetTypes())
{
    var myInterfaceType = typeof(IMyInterface);
    if (type != myInterfaceType && myInterfaceType.IsAssignableFrom(type))
    {
        Console.WriteLine("{0} implements IMyInterface", type);
    }
}

您應該查看企業庫中的類型選擇器工具 它可能不是您直接想要的,但它確實可以滿足您的描述,您也許可以從中借用一些實現。

首先,我建議您要這樣做。 為此,您必須從GAC加載所有程序集。 我建議您讓您的用戶(或管理員,或其他任何人)告訴您要嘗試從哪些程序集中進行加載(盡管如此,您可能需要所有選項的列表,這可能就是為什么要這樣做的原因)。 ..)

就是說,這可能有用,但是它為應該使用的多個程序集拋出了錯誤,我不確定為什么...。此外,我不確定如何檢測GAC的位置-c:\\ windows \\ assembly是默認值,但是我不知道實際值存儲在哪里(注冊表?)

var targetType = typeof(IComparable);
var errors = new List<Exception>();
var c = Directory.GetFiles(@"c:\windows\assembly", "*.dll", SearchOption.AllDirectories).ToList()
    .ConvertAll(f => Path.GetFileNameWithoutExtension(f))
    .Where(f => !f.EndsWith(".ni"))
    .Distinct().ToList()
    .ConvertAll(f => { try { return Assembly.ReflectionOnlyLoad(f); } catch (Exception ex) { errors.Add(ex); return null; } })
    .Where(a => a != null)
    .SelectMany(a => { try { return a.GetTypes(); } catch (Exception ex) { errors.Add(ex); return new Type[] { }; } })
    .Where(t => targetType.IsAssignableFrom(t));

祝你好運。

暫無
暫無

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

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