MEF - 是否可以使用directorycatalog获取相同代码的最新编译DLL?

时间:2011-11-07 12:28:09

标签: mef

假设我有合同

public interface IGreeting
{
    string SayHelloWorld();
}

另一个dll的课程

[Export(typeof(IGreeting))]
public class Greeting : IGreeting
{
    public string SayHelloWorld()
    {
        return "GREETING V1";
    }
}

我使用directorycatalog获取此DLL。我工作得很好。当我像这样更新我的源代码时:

[Export(typeof(IGreeting))]
public class Greeting : IGreeting
{
    public string SayHelloWorld()
    {
        return "GREETING V2";
    }
}

并将这个新的DLL“Next”放入旧的Greeting DLL Mef并不导入多个不同的Greeting类,但从2个DLL中选择1个并从同一个类中导出2次。

所以最终执行目录如下所示:

MyApp.exe
Greeting_V1.dll   
Greeting_V2.dll

我希望应用程序使用ImportMany导入2个Greeting类。它给了我来自Greeting_V1.dll的2个实例。如果我删除Greeting_V2.dll,它只给我一个Greeting_V1.dll实例。

2 个答案:

答案 0 :(得分:1)

好吧,对我来说,看起来你正在导入许多IGreeting的实例,所以从这个意义上说,MEF正在做它应该做的事情。如果要将V1组件中Greeting的实例替换为V2中的实例,请删除V1组件,这样MEF只能加载可用的组件。

答案 1 :(得分:0)

这不是MEF问题。问题出在.NET的加载模型中。 (或更好地通过.net加载对象的方式)

当MEF加载时,它返回正确的对象。但是当在加载V2时查找类问候语时,已经有一个用于V1 dll的Greeting类加载了V2的正确类的问候语名称。并且没有加载V2实际引用的dll加载器。