gpt4 book ai didi

具有强名称的 C# 插件架构 : A Misunderstanding

转载 作者:行者123 更新时间:2023-11-30 13:25:02 25 4
gpt4 key购买 nike

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

这个可执行文件是强命名的。

下列说法是否正确:

In order for a strongly named assembly to load another assembly, the loaded assembly must also be signed with the same key.

如果程序集未经过强签名,则以下代码返回 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);
}
}

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

最后,假设我有一个实现 IService 接口(interface)的程序集,但也引用了一个程序集,该程序集引用了另一个程序集,每个程序集都使用不同的 key 签名。当我尝试加载时会发生什么?他们都应该用同一个 key 签名吗?

最佳答案

下列说法正确的是:

In order for a strongly named assembly to load another assembly, the loaded assembly must also be signed with the same key .

来自 MSDN :

If the strong-named assembly then references an assembly with a simple name, which does not have these benefits, you lose the benefits you would derive from using a strong-named assembly and revert to DLL conflicts. Therefore, strong-named assemblies can only reference other strong-named assemblies.


编辑:哦!虽然我的回答是正确的,但正如 P 爸爸指出的那样,这无关紧要!

使用反射加载弱命名程序集与引用不同,并且不受相同方式的限制。

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

  • Interface.dll(签名,包含IService)

  • Loader.exe(签名,一个采用路径的控制台应用程序,使用您的代码加载并返回第一个IService 它在该 path 指定的程序集中找到,然后调用 IService 方法)

  • Plugin.dll(未签名,包含一个IService实现)

接下来,我添加了一个 Plugin.dllLoaded.exe 的引用,并尝试访问它的 IService 实现,但正如预期的那样失败了以下消息:“程序集生成失败——引用的程序集‘插件’没有强名称。”

最后,我运行了控制台应用程序,将弱命名的 Plugin.dll 的名称传递给它,它工作得很好。

似乎还有其他事情正在发生。 Scott Hanselman has blogged about the vagaries of dynamic assembly loading on several occasions , 他指向 Suzanne Cook's blog有关该主题的权威详细信息。

关于具有强名称的 C# 插件架构 : A Misunderstanding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com