代码之家  ›  专栏  ›  技术社区  ›  Alan

具有强名称的C#插件体系结构:一个误解

  •  3
  • Alan  · 技术社区  · 17 年前

    我有一个服务器可执行文件,它与Active Directory对话以检索用户信息。除了AD之外,这个exe还允许客户编写自己的插件与自定义用户目录进行对话。

    此可执行文件具有强名称。

    以下陈述是否属实:

    为了一个名字很重的 加载的程序集也必须签名

    如果程序集没有强签名,并且没有错误表明程序集没有正确签名,则以下代码返回null。请注意,如果我对程序集进行签名,我将得到一个IService实例。这让我相信加载的程序集必须经过强签名。

    Assembly assembly = Assembly.LoadFrom(path);
    
    foreach (Type t in assembly.GetTypes())
    {
        if (t.GetInterface(typeof(IService).FullName) != null)
        {
          return (Activator.CreateInstance(t) as IService);
        }
    }
    

    那么,这是否意味着如果您有一个强签名的程序集,并且支持程序集插件,那么它们也必须被签名——插件编写者必须使用相同的密钥对它们进行签名?听起来不对。

    3 回复  |  直到 17 年前
        1
  •  9
  •   Jeff Sternal    17 年前

    为了获得强名称程序集 若要加载另一个程序集,请加载 .

    MSDN :

    如果强名称程序集 利益,你失去了你想要的利益 将从使用强名称 因此,可以使用强名称程序集 仅引用其他强名称 装配。


    编辑

    参考 一个,不受同样的限制。

    我使用以下程序集重新创建了您的代码(或至少是近似代码):

    • Interface.dll ( 签署 IService )

    • Loader.exe 签署 path ,使用您的代码加载并返回第一个 它在该指定的程序集中找到 路径 伊瑟薇 (方法)

    • Plugin.dll ( 不署名 伊瑟薇 (实施)

    提及 Loaded.exe 伊瑟薇 实现,如预期的那样失败,并显示以下消息:“程序集生成失败--引用的程序集'Plugin'没有强名称。”

    Plugin.dll

    似乎还有别的事情在进行中。 Scott Hanselman has blogged about the vagaries of dynamic assembly loading on several occasions Suzanne Cook's blog

        2
  •  2
  •   Justin Niessner    17 年前

    如果您的程序集是 签名,我认为您加载的任何程序集也必须是 已签名…但不一定使用相同的密钥签名。

        3
  •  2
  •   Daniel Brückner    17 年前

    语句错误-引用的程序集必须签名,但不一定使用相同的键。

    引用强命名程序集时,您希望获得某些好处,例如版本控制和命名保护。如果强名称程序集引用了一个简单名称的程序集,而该程序集没有这些优点,则您将失去使用强名称程序集所带来的好处,并恢复为DLL冲突。因此,强名称程序集只能引用其他强名称程序集。

    (摘自 MSDN Library