3

阿罗哈

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

-Edoode

4

5 回答 5

4

要添加到 BFree 的答案,我建议您可以加载程序集仅用于反射。这为您提供了增强的安全性(程序集根本无法执行)而无需应用程序域和灵活性(您可以加载用于不同体系结构的程序集)。

于 2009-04-14T15:18:37.237 回答
3

Gac 实际上只是您机器上的一个目录,就像其他任何目录一样。这是典型的细分:

c:\windows\assembly\GAC

                   \GAC_32

                   \GAC_MSIL

也许还有一些人..

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

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

一些链接:

搜索目录。

加载程序集并检查给定接口。

创建新的 AppDomain。

于 2009-04-14T15:03:44.917 回答
3

首先澄清一下: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);
    }
}
于 2009-04-14T15:14:45.813 回答
1

您应该查看 Enterprise Library 中的类型选择器工具。它可能不是您直接想要的,但它会按照您的描述进行,您可能可以从中借用一些实现。

于 2009-04-14T15:16:31.877 回答
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));

祝你好运。

于 2009-04-14T15:23:58.257 回答