在编译时静态引用的程序集的运行时交换

时间:2010-12-10 06:47:07

标签: c# .net dependencies assembly-resolution

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

App Assembly:

  • 参考文献Common Assembly
  • 服务程序集中的引用ServiceProviderFactory

Common Assembly:

  • 定义IServiceProvider

服务组装:

  • 提供ServiceProviderFactoryIServiceProvider s的工厂)
  • 参考文献Common Assembly

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

我认为必须坚持以下几点:

  1. 相同的程序集名称,
  2. 在强名称程序集中命名为assembly或same version number
  3. ServiceProviderFactory签名保持不变。
  4. 注意:使用反射并在服务程序集中搜索IServiceProvider的实现似乎比依赖某些具有固定签名的ServiceProviderFactory似乎更好但我仍然对答案感兴趣以上。

1 个答案:

答案 0 :(得分:1)

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

当我尝试支持引用MEF的已发布版本的.NET 4应用程序中引用了MEF的CodePlex版本的.NET 2.0程序集时,我实际上尝试了这个作为概念验证。这是一个link to my question,有人用这个邪恶的伎俩作出回应。

然而,这一切都非常棘手,我觉得在实际应用中做这件事并不舒服。您是否可以将接口提取到单独的程序集中,然后使用某种依赖注入(如MEF或Unity)来动态加载实现这些接口的类型?