Изменить Dll загружен с MEF - PullRequest
       1

Изменить Dll загружен с MEF

4 голосов
/ 04 января 2011

Я использую MEF и System.ComponentModel.Composition.dll для загрузки некоторых DLL.

Я делаю что-то вроде:

AggregateCatalog catalog = new AggregateCatalog(new AssemblyCatalog(Assembly.GetExecutingAssembly()), new DirectoryCatalog(directory));
_container = new CompositionContainer(catalog);
_container.ComposeParts(this);

чтобы импортировать мою dll.

Через некоторое время я хотел бы обновить свою dll, но если я попытаюсь удалить ее, у меня будет отказано в доступе, потому что она фактически используется программой.

Как я могу освободить dll, заменить на новую dll и снова загрузить dll? (без закрытия программы)

Заранее спасибо за помощь

Ответы [ 2 ]

4 голосов
/ 04 января 2011

Вам необходимо включить теневое копирование в AppDomain, это заставит приложение вести себя подобно веб-приложению, в котором исполняемый контент запускается не из исходного расположения, а из временного расположения.

Единственная проблема, которая у вас есть, это либо

  1. Используйте устаревший метод AppDomain.CurrentDomain.SetShadowCopyFiles(), который навязывает его текущему домену. Не рекомендуется, поскольку это устарело в пользу:
  2. Используйте AppDomainSetup.ShadowCopyFiles = "true"; при создании нового AppDomain. Затем вам нужно отложить выполнение вашей сборки в другом AppDomain. Может быть, эта форма сообщения может помочь?

Я не уверен, что вы можете включить теневое копирование через конфигурацию приложения ...

1 голос
/ 13 февраля 2013

Если вы попытаетесь вставить в каталог одну сборку объекта следующим образом:

Assembly assembly = Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(directoryPath, ItemPlugin)));
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly));

Вы можете удалить \ изменить файл позже ...

...