#mef
#mef
Вопрос:
Допустим, у меня есть контракт
public interface IGreeting
{
string SayHelloWorld();
}
И класс в другой DLL
[Export(typeof(IGreeting))]
public class Greeting : IGreeting
{
public string SayHelloWorld()
{
return "GREETING V1";
}
}
Я использую directorycatalog для получения этой DLL. I работает нормально. Когда я обновляю свой исходный код следующим образом:
[Export(typeof(IGreeting))]
public class Greeting : IGreeting
{
public string SayHelloWorld()
{
return "GREETING V2";
}
}
и поместите эту новую DLL «Рядом» со старой приветствующей DLL Mef не импортирует несколько разных классов приветствий, а выбирает 1 из 2 DLL и экспортирует 2 раза из одного и того же класса.
Итак, конечный каталог выполнения выглядит следующим образом:
MyApp.exe
Greeting_V1.dll
Greeting_V2.dll
Я хочу, чтобы приложение импортировало 2 класса приветствий с помощью ImportMany. Это дает мне 2 экземпляра из Greeting_V1.dll . Если я удалю Greeting_V2.dll это дает мне только 1 экземпляр Greeting_V1.dll .
Ответ №1:
Ну, для меня это выглядит так, как будто вы импортируете много экземпляров IGreeting
, так что в этом смысле MEF делает именно то, что он должен делать. Если вы хотите заменить экземпляр Greeting
из сборки V1 тем, что есть в версии V2, удалите сборку V1, таким образом, MEF сможет загружать только то, что доступно.
Комментарии:
1. Моя проблема в том, что MEF загружает не экземпляры V1 и V2, а 2 экземпляра V1. Я хочу, чтобы он загружал 2 разных экземпляра. 1 из V1, 1 из V2. У меня есть V1.dll и V2.dll в моей папке. Я не могу удалить V1.dll потому что приложение запущено.
Ответ №2:
Это не проблема MEF. Проблема заключается в модели загрузки .NET. (или, лучше, в том, как ваши объекты загружаются .net)
Когда MEF загружается, он возвращает правильные объекты. Но при поиске приветствия класса при загрузке V2 уже есть класс приветствия для V1 dll, загруженный с правильным именем приветствия класса, на которое ссылается V2. И загрузчик, на который фактически ссылается dll V2, не загружен.