c# - MEF 依赖关系和版本控制

标签 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
  • composer-v1.exe
  • 核心v1.exe

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

  • /parts/part1-v1.dll
  • /parts/part1-v2.dll
  • /parts/part2-v1.dll
  • composer-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();
    }
}

最佳答案

不是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;
    }
}

关于c# - MEF 依赖关系和版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4962638/

相关文章:

c# - 在 C# 中更改子文件夹的权限

c# - 如何确定 MonoTouch 是否可以使用程序集?

javascript - 使用 JavaScript 访问 Repeater 值

java - 将我的应用程序连接到 WCF 服务

c - 需要帮助从 Delphi 正确调用 C 函数

DLLNotFoundException - Unity3D 插件

c# - 提供对巨大的非数据库数据集的 oData 访问

c# - wpf windows 位置问题

c# - 带有 native 代码 DLL 的 Excel 2016 VSTO 插件

c# - 使用 Rhino Mocks stub 只读属性