1

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

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

设想:

  • 有 2 个版本的通用程序集(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 构建的
  • 使用的相关第三方组件:微软的 Prism and ServiceLocation and 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>
{

}

问题:

在加载插件 #2 时,我收到一个 ReflectionTypeLoadException,因为 Foo 1.1.0.0 版本的类与 1.2.0.0 版本的 Foo 类不同,因此使用 Foo 作为视图模型的类型参数插件 #2 无效。

想法:

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

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

有没有人设法获得像这样工作的真正并排(不要与.NET框架并排混淆)场景(无论是在单个还是多个应用程序域中)?


非常感谢,

4

1 回答 1

0

我们最终在主机应用程序的 app.config 文件中使用程序集重定向解决了这个问题。

于 2013-05-09T13:05:44.247 回答