此可执行文件名称很强.
以下是真实的陈述:
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); }}
那么,这是否意味着如果你有一个强签名的程序集和支持程序集插件,它们也必须签名 – 插件编写者必须用相同的密钥签名?这听起来不对.
最后,假设我有一个实现IService接口的程序集,但也引用了一个程序集,它引用了另一个程序集,每个程序集都用不同的密钥签名.我尝试加载时会发生什么?他们都应该用同一把钥匙签名吗?
解决方法 以下陈述是正确的:In order for a strongly named assembly
to load another assembly,the loaded
assembly must also be signedwith 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.
编辑:D’哦!虽然我的答案是真的,正如P爸爸指出的那样,这是无关紧要的!
使用反射加载弱命名的程序集与引用程序集不同,并且不受同样的限制.
我使用以下程序集重新创建了您的代码(或至少近似):
> Interface.dll(已签名,包含IService)
> Loader.exe(已签名,一个采用路径的控制台应用程序,使用您的代码加载并返回它在该路径指定的程序集中找到的第一个IService,然后调用IService方法)
> Plugin.dll(未签名,包含IService实现)
接下来,我向Loaded.exe添加了一个Plugin.dll引用,并尝试访问其IService实现,该实现失败,如下所示:“程序集生成失败 – 引用程序集’插件’没有强名称.”
最后,我运行了控制台应用程序,并将其命名为名称不足的Plugin.dll,它运行得很好.
似乎还有其他事情正在发生. Scott Hanselman has blogged about the vagaries of
dynamic assembly loading on several occasions,他指向Suzanne Cook’s blog获取有关该主题的权威详细信息.
以上是内存溢出为你收集整理的具有强名称的C#插件架构:误解全部内容,希望文章能够帮你解决具有强名称的C#插件架构:误解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)