我正在做一个插件系统,其中主应用程序在新 AppDomain 的运行时加载程序集 Addin1.dll 和 Addin2.dll。
但是,如果 Addin1.dll 使用我的密钥签名(强名称)而 Addin2.dll 没有,我希望能够只加载 Addin1.dll 并拒绝 Addin2.dll。
我怀疑需要通过在 AppDomainSetup 中设置一些参数来完成?
我正在做一个插件系统,其中主应用程序在新 AppDomain 的运行时加载程序集 Addin1.dll 和 Addin2.dll。
但是,如果 Addin1.dll 使用我的密钥签名(强名称)而 Addin2.dll 没有,我希望能够只加载 Addin1.dll 并拒绝 Addin2.dll。
我怀疑需要通过在 AppDomainSetup 中设置一些参数来完成?
查看采用 Evidence 参数的Assembly.Load方法。您可以在此处找到如何从您的公钥创建证据的示例。
您可以实现一个 DomainManager 并根据您喜欢的任何内容来决定您的加载/阻止决策。我在这里回答了一个有点相关的问题。
您可以使用AppDomain 类的 Load 方法将新程序集加载到 Appdomain 中,前提是客户端或最终用户环境满足程序集的发布者策略。
此外,强命名程序集遵循程序集发布者和 CLR 制定的所有规则。所以程序集的用户需要满足被加载到应用程序域的程序集的安全性。
CLR 使用强名称属性从 GAC 加载引用的全局程序集。如果引用的程序集在 GAC 中可用,CLR 将返回其包含的子目录并加载包含清单的文件。以这种方式查找程序集可确保调用者在运行时加载的程序集来自构建代码编译所针对的程序集的同一发布者。现在比较引用程序集的 assemblyRef 表中的公钥标记和被引用程序集的 AssemblyDef 表中的公钥标记。如果引用的程序集不在 GAC 中,CLR 会查找应用程序的基目录,然后查找应用程序配置文件中标识的私有路径;如果使用 MSI 安装包含程序集的应用程序,则 CLR 调用 MSI 以加载所需的程序集。