假设我有合同
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实例。
答案 0 :(得分:1)
好吧,对我来说,看起来你正在导入许多IGreeting
的实例,所以从这个意义上说,MEF正在做它应该做的事情。如果要将V1组件中Greeting
的实例替换为V2中的实例,请删除V1组件,这样MEF只能加载可用的组件。
答案 1 :(得分:0)
这不是MEF问题。问题出在.NET的加载模型中。 (或更好地通过.net加载对象的方式)
当MEF加载时,它返回正确的对象。但是当在加载V2时查找类问候语时,已经有一个用于V1 dll的Greeting类加载了V2的正确类的问候语名称。并且没有加载V2实际引用的dll加载器。