Ala*_*lan 3 c# plugins strongname assemblies key
我有一个服务器可执行文件与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);
}
}
Run Code Online (Sandbox Code Playgroud)
那么,这是否意味着如果你有一个强签名的程序集和支持程序集插件,它们也必须签名 - 插件编写者必须使用相同的密钥签名?这听起来不对.
最后,假设我有一个实现IService接口的程序集,但也引用了一个程序集,它引用了另一个程序集,每个程序集都用不同的密钥签名.我尝试加载时会发生什么?他们都应该用同一把钥匙签名吗?
以下陈述是正确的:
为了使强名称程序集加载另一个程序集,加载的程序集也必须
使用相同的键进行签名.
来自MSDN:
如果强名称程序集然后引用具有简单名称的程序集(没有这些好处),则会失去使用强命名程序集并恢复到DLL冲突所带来的好处.因此,强名称程序集只能引用其他强名称程序集.
编辑:D'哦!虽然我的答案是真的,正如P爸爸指出的那样,这是无关紧要的!
使用反射加载弱命名的程序集与引用程序集不同,并且不受同样的限制.
我使用以下程序集重新创建了您的代码(或至少近似):
Interface.dll(签名,包含IService)
Loader.exe(签名,一个控制台应用程序,它path使用你的代码加载并返回IService它在由它指定的程序集中找到的第一个path,然后调用一个IService方法)
Plugin.dll(未签名,包含IService实施)
接下来,我添加了一个Plugin.dll引用Loaded.exe并尝试访问它的IService实现,该实现失败,如下所示:"程序集生成失败 - 引用程序集'插件'没有强名称."
最后,我运行了控制台应用程序,将其命名为弱名称Plugin.dll,并且工作得很好.
似乎还有其他事情正在发生.斯科特·汉塞尔曼曾多次在博客上发表关于动态装配加载变幻莫测的博客,并指出苏珊娜库克的博客有关该主题的权威细节.