在主机/插件方案中使用同一类的不同版本

时间:2012-08-08 11:21:50

标签: wpf assemblies appdomain gac

我开发了一个基于WPF插件的应用程序,其中插件程序集被动态加载到“主机”应用程序中,主机应用程序及其插件都引用了通用程序集。

如果在将来的某个时候我希望调整一个通用程序集的类,我不想重新编译所有的插件,以便它们可以在一个可能正在运行的主机应用程序中工作不同版本的通用程序集。

情境:

  • 有两个版本的通用程序集(1.1.0.0和1.2.0.0),签名并部署了全局程序集缓存。每个都包含一个类“Foo”,它在版本之间保持不变。由于这种架构,Foo必须保持在通用组件中。
  • 主机应用程序是针对通用版本1.1.0.0构建的,并提供了一个基类,所有插件中的视图模型都可以从中派生出来;它的功能非常以UI为中心,因此它必须保留在主机应用程序中。
  • 插件#1是针对通用版本1.1.0.0
  • 构建的
  • 插件#2是针对通用版本1.2.0.0构建的
  • 使用的相关第三方组件:Microsoft的Prism和ServiceLocation以及Castle(Windsor)

常见:

public class Foo
{
    // Some useful properties
}

主机:

public class ViewModelBase<T> where T : Foo
{
    // Some useful behaviour
}

插件#1:

public class ViewModel : ViewModelBase<Foo>
{

}

插件#2:

public class ViewModel : ViewModelBase<Foo>
{

}

ISSUE:

加载插件#2后,我收到一个ReflectionTypeLoadException,因为版本1.1.0.0的Foo类不被认为与版本1.2.0.0的Foo类相同,所以使用Foo作为类型参数插件#2中的视图模型无效。

IDEAS:

  • 使用更不可变的“核心”通用程序集来包含Foo类(但最终,这将需要从太多不同的程序集中获取太多类),因此不是一个选项< / EM>

  • 使用程序集重定向(但强制插件使用与主机应用程序相同版本的通用程序集并不能保证在开发期间工作的插件将继续在部署后工作,除非规则被放置确保不使用过时属性引入任何重大更改

有没有人设法得到真正的并排(不要与.NET框架并排)这样的场景(在单个或多个应用程序域中)吗?


非常感谢,

罗布

1 个答案:

答案 0 :(得分:0)

我们在Host应用程序的app.config文件中使用程序集重定向来解决此问题。