MEF — Возможно ли с помощью directorycatalog получить последнюю скомпилированную DLL для того же кода?

#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, не загружен.