Невозможно удалить каталог после использования в совокупном каталоге - PullRequest
0 голосов
/ 13 июня 2018

Я использую MEF (System.ComponentModel.Composition) CompositionContainer в Visual Studio 2017 с .net 4.5.1 для загрузки некоторых классов из dll из каталога X.

_catalogs = new AggregateCatalog();
var dir = new DirectoryCatalog("X", "*.dll");
compositionContainer = new CompositionContainer(_catalogs, true);
compositionContainer.ComposeParts();

IЯ могу получить доступ к тому, что мне нужно без проблем.В какой-то момент я удаляю каталог из композиции:

 _catalogs.Catalogs.Remove(_catalogs.Catalogs.First());

Это работает, и после этого у меня нет экземпляра моей dll в CompositionContainer или AggregateCatalog.

Myпроблемы в том, что теперь, если мое приложение все еще открыто, я не могу удалить каталог «X», переместить или переименовать его.Я получаю сообщение «Доступ к пути запрещен» из кода или из Проводника.

Кто-нибудь знает, что может привести к тому, что каталог все еще будет присоединен к CompositionContainer даже после его удаления?Или я удаляю это неправильно?

Спасибо.

1 Ответ

0 голосов
/ 13 июня 2018

Pfff ... Недостаточно удалить каталог или даже вызвать Dispose() для него.Зачем?Потому что MEF по умолчанию загружает сборки вашего каталога в текущий AppDomain .Это означает, что файлы ваших сборок заблокированы вашим доменом приложений, поэтому вы не можете выполнять над ними операции ввода-вывода.

Из документации о загрузке и выгрузке сборок:

Невозможно выгрузить отдельную сборку без выгрузки всех доменов приложений, которые ее содержат.Используйте метод Unload из AppDomain, чтобы выгрузить домены приложения.Для получения дополнительной информации см. Как: выгрузить домен приложения.

Теперь, очевидно, вы не можете выгрузить свой домен приложений, потому что у вас есть только один =).Итак, это дает нам только одну альтернативу, да, вы правы: используйте другой домен приложений

У меня было то же самое требование пару месяцев назад, и я следовал этому Статья CodeProject, которая мне очень помогла.Название статьи - MEF и AppDomain - удаление сборок на лету , что в значительной степени то, что вам нужно =)

РЕДАКТИРОВАНИЕ ОП решил проблему по умолчаниюappDomain устанавливает ShadowCopyFiles на:

AppDomain.CurrentDomain.SetShadowCopyFiles();
...