2

在什么情况下,我可以将在编译时静态引用的程序集换成另一个在运行时使用的程序集?例如:

应用程序组装:

  • 参考 通用程序集
  • ServiceProviderFactory服务组装中的引用

普通组装:

  • 定义IServiceProvider

服务组装:

  • 提供ServiceProviderFactoryIServiceProviders 的工厂)
  • 参考 通用程序集

鉴于上述情况,我希望能够在安装时更换服务程序集,但我不知道在什么条件下新的服务程序集将继续加载。

我相信以下必须成立:

  1. 相同的程序集名称,
  2. 弱命名程序集或强命名程序集中的相同版本号,以及
  3. ServiceProviderFactory签名保持不变。

注意:使用反射和搜索服务程序集的实现似乎IServiceProvider比依赖一些ServiceProviderFactory具有固定签名的实现更好,但我仍然对上述答案感兴趣。

4

1 回答 1

1

如果它是强命名的,那么除了版本差异之外,您不能真正使用程序集重定向。但是,您可以使用 AppDomain.AssemblyResolve 事件来提供程序集,以响应绑定请求的程序集失败。

当我尝试支持在引用已发布的 MEF 构建的 .NET 4 应用程序中引用 MEF 的 CodePlex 构建的 .NET 2.0 程序集时,我实际上尝试将此作为概念证明。这是我的问题的链接,有人用那个邪恶的把戏做出了回应。

然而,这一切都非常棘手,我不会在实际应用程序中这样做。您能否将您的接口提取到一个单独的程序集中,然后使用某种依赖注入(例如 MEF 或 Unity)来动态加载实现这些接口的类型?

于 2010-12-10T06:54:39.403 回答