列出从GAC实现特定接口的所有DLL

时间:2009-04-14 14:53:19

标签: c# plugins gac

阿罗哈

鉴于插件架构(C#/ .NET 3.5)以及存储在GAC中的插件,我如何列出/加载包含实现我的特定接口的类型的所有dll?换句话说,我想通过查看GAC来调查我的应用程序的哪些插件安装在计算机上。

-Edoode

5 个答案:

答案 0 :(得分:4)

要添加到BFree的答案,我建议您load the assemblies for reflection only。这为您提供了增强的安全性(程序集根本无法执行),没有appdomains和灵活性(您可以加载适用于不同体系结构的程序集)。

答案 1 :(得分:3)

Gac实际上只是您机器上的一个目录。这是典型的细分:

c:\windows\assembly\GAC

                   \GAC_32

                   \GAC_MSIL

也许还有其他人......

在每个文件夹中,您都可以找到存储实际dll的子文件夹。您首先需要编写一个递归方法来获取在\ assembly \下找到的所有dll(如果您不熟悉自己,可以轻松地在线找到这些dll)。获得dll列表后,可以继续使用Assembly.LoadFile加载程序集并检查所有类型以查看它们是否实现了给定的接口。

我唯一的建议是在单独的appdomain中加载这些dll,这样你就不会允许任何潜在的有害dll加载到你的应用中。

一些链接:

Searching Directories.

Loading Assemblies and checking for a given interface.

Creating new AppDomain.

答案 2 :(得分:3)

首先澄清一点:DLL无法实现接口。 DLL包含可以实现特定接口的类型。这是一个.NET wrapper围绕fusion.dll,它允许您枚举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);
    }
}

答案 3 :(得分:1)

您应该查看Enterprise Library中的Type Selector Tool。它可能不是你想要的直接,但是你做的就是你所描述的,你可以从中借用一些实现。

答案 4 :(得分:0)

首先,我建议这样做。为此,您必须从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));

祝你好运。