MEF не может перезаписать файл DirectoryCatalog. Доступ закрыт - PullRequest
0 голосов
/ 18 октября 2011

У меня проблемы с MEF, когда у меня есть DirectoryCatalog, и на более позднем этапе я хочу перезаписать сборку и "обновить" каталог.

Проблема, с которой я сталкиваюсь, заключается в том, что файл просто «используется», и я не могу перезаписать файл. Обычно вы можете перезаписать сборку .Net.

Я предполагаю, что MEF использует его, но как это соотносится с перекомпиляцией?!

Вот мой пример кода. Даже с локальными переменными файл все еще используется.

Я также пытался разместить сборку в папке приложения и плагина, но затем используется версия папки приложения, поэтому перезапись не имеет значения.

public RecompilationExample()
{
    DirectoryInfo dir = new DirectoryInfo(".\\plugin");

    if (!dir.Exists)
        dir.Create();

    DirectoryCatalog d; 
    CompositionContainer c;

    d = new DirectoryCatalog(".\\plugin");
    d.Changed += new EventHandler<ComposablePartCatalogChangeEventArgs>(d_Changed);

    c = new CompositionContainer(d);
    c.ExportsChanged += new EventHandler<ExportsChangeEventArgs>(c_ExportsChanged);
    c.ComposeParts(this);
}

1 Ответ

3 голосов
/ 18 октября 2011

Обычно вы можете перезаписать сборку .Net.

Насколько я знаю, нет. Загруженная сборка .NET не может быть перезаписана. Вы также не можете выгрузить загруженную сборку (за исключением разгрузки всего AppDomain , в котором она находится).

Вместо этого вы можете использовать теневое копирование , т.е. копировать сборку и затем загружать копию. Вы можете включить это с помощью свойства AppDomainSetup.ShadowCopyFiles . Обычно это используется в ASP.NET и позволяет перезаписать исходный файл, но не таким образом, чтобы это влияло на запущенный процесс - до его перезапуска.

См. Также этот другой ответ Я написал в ответ на аналогичный вопрос. Короче говоря: вы можете использовать DirectoryCatalog.Refresh до добавления новых сборок на лету, но не для их замены или удаления. Когда вам нужно заменить сборки, лучшим решением будет перезапустить процесс.

...