MEF依赖关系和版本控制

时间:2011-02-10 21:01:36

标签: c# .net dll versioning mef

我有一个使用MEF加载零件的系统。这些部分中的每一部分都依赖于核心库。当我构建项目时,我将这样的版本号添加到.dll文件中:

  • part1-1.0.0.0.dll
  • part2-1.0.0.0.dll

此外,还有一个执行MEF组合的应用程序。它还使用核心库。我发现我可以部署“部分”dll,并且组合工作正常,因为应用程序已经加载了部件所依赖的核心库。所以我的文件系统看起来像这样:

  • /parts/part1-v1.dll
  • /parts/part2-v1.dll
  • 作曲家-v1.exe
  • 芯v1.exe

我遇到的麻烦是如何处理核心和部件的版本控制。假设我对核心及其中一个部分进行了更新。然后,我部署更改。所以现在我的文件系统看起来像:

  • /parts/part1-v1.dll
  • /parts/part1-v2.dll
  • /parts/part2-v1.dll
  • 作曲家-v1.exe
  • 芯v1.dll
  • 芯v2.dll

如何确保part1-v1.dll使用core-v1.dll,part1-v2.dll使用core-v2.dll?我需要加载所有版本的部件并使用适当的核心版本。

零件类看起来像这样:

[Export(typeof(IPart))]
public class Part1
{
    public string GetSomethingFromCore()
    {
        return Core.GetSomethingFromCore();
    }
}

[Export(typeof(IPart))]
public class Part2
{
    public string GetSomethingFromCore()
    {
        return Core.GetSomethingFromCore();
    }
}

2 个答案:

答案 0 :(得分:5)

strong naming不能解决您的问题吗?如果程序集是针对强命名依赖项构建的,那么您就知道它只接受完全相同的依赖关系到最后一个字节。

或者,如果强命名限制太多,您可以将版本号放在类型名称中。例如:

[Export(typeof(IPart))]
public class Part1v1
{
    private readonly ICorev1 core;

    [ImportingConstructor]
    public Part1v1(ICorev1 core)
    {
        this.core = core;
    }
}

[Export(typeof(IPart))]
public class Part1v2
{
    private readonly ICorev2 core;

    [ImportingConstructor]
    public Part1v2(ICorev2 core)
    {
        this.core = core;
    }
}

答案 1 :(得分:1)

您需要为核心程序集提供所有部件strong names,然后在加载引用的程序集时需要完全匹配。这也意味着您需要部署核心程序集的多个副本。即而不是

  • /parts/part1-v1.dll
  • /parts/part1-v2.dll
  • /parts/part2-v1.dll
  • 作曲家-v1.exe
  • core-v1.dll
  • 芯v2.dll

你将拥有:

  • /parts/1-1/part1-v1.dll
  • /parts/1-1/core-v1.dll
  • /parts/1-2/part1-v2.dll
  • /parts/1-2/core-v2.dll
  • /parts/2-1/part2-v1.dll
  • /parts/2-1/core-v1.dll
  • 作曲家-v1.exe
  • core-v1.dll
  • 芯v2.dll

我过去的方式就是将每个部分存储在一个单独的文件夹中,以及它需要的所有依赖项。即使它们(当前)与应用程序中的版本相同。因此,当您将应用程序移至core-v2时,依赖于core-v1的所有部分仍将拥有它。