我正在做一个插件系统,其中主应用程序在运行时在新的AppDomain中加载程序集Addin1.dll和Addin2.dll。
但是,如果Addin1.dll使用我的密钥签名(强名称)而Addin2.dll不是,我希望只能加载Addin1.dll并拒绝Addin2.dll。
我怀疑它需要通过在AppDomainSetup中设置一些参数来完成吗?
答案 0 :(得分:2)
查看带有Evidence参数的Assembly.Load方法。您可以找到如何使用公钥here创建证据的示例。
答案 1 :(得分:0)
您可以实现域管理器,并根据您的喜好来确定加载/阻止决策。我回答了一个有点相关的问题here.
答案 2 :(得分:0)
如果客户端或最终用户环境满足程序集的发布者策略,则可以使用Load method of AppDomain class将新程序集加载到Appdomain中。
强名称程序集也遵循程序集发布者和CLR规定的所有规则。因此,程序集的用户需要满足加载到appdomain中的程序集的安全性方面。
CLR使用强名称属性从GAC加载引用的全局程序集。如果引用的程序集在GAC中可用,则CLR将返回其包含的子目录,并且加载包含清单的文件。以这种方式查找程序集可以确保调用者在运行时加载的程序集来自构建编译代码的程序集的同一发布者。现在比较引用程序集的assemblyRef表中的公钥令牌和引用程序集的AssemblyDef表中的公钥令牌。如果引用的程序集不在GAC中,则CLR将查找应用程序的基本目录,然后查找应用程序配置文件中标识的专用路径;如果使用MSI安装包含程序集的应用程序,则CLR调用MSI来加载所需的程序集。如果在任何这些位置找不到程序集,则抛出异常,最后程序集绑定失败。