Заменить сборку во время выполнения с помощью .NET.

Есть ли способ с плагиновой системой (я бы использовал с контейнером IoC), чтобы загрузить одну версию сборки во время выполнения, а затем заменить эту DLL во время работы AppDomain? Я не хочу перезапускать приложение.

Помогает ли MEF что-то вроде этого?

Ответ 1

Это, по сути, то, что делает NUnit (или, по крайней мере, я не был в коде в то время). Но он делает это, загружая тестовую сборку в другой AppDomain, вызывая код в этом домене, используя метод DoCallback AppDomain, а затем перезагружает тестовую сборку, если она перекомпилирована.

Итак, пока вы не можете выгружать или перезагружать DLL, но вы можете выгружать и перезагружать приложение и выполнять код в нем.

Ответ 2

Невозможно использовать чистую .net, потому что нет способа выгрузить сборку из домена. Поскольку MEF написан в управляемом коде, я сомневаюсь, что это возможно. Я решил эту проблему, загрузив сборку в отдельный домен, и когда я захочу ее перезагрузить, я остановил ее и начал снова.

Ответ 4

Похоже, эта статья CodeProject объясняет, как это сделать. Этот вопрос на форумах MSDN кажется похожим, и этот вопрос SO показывает, как это сделать Это. Все эти ссылки предупреждают о том, что утечки создаются из-за проблем с правильной настройкой AppDomains, поэтому покупатель остерегается.

Ответ 5

Вы не можете выгружать DLL из работающего домена приложения. Что вы можете сделать, это использовать MEF и подготовить приложение для обработки нескольких реализаций. В этом случае вы можете скопировать новую dll (новую реализацию интерфейса, модуля и т.д.) В папку MEF, перекомпоновать и использовать ее. Но, осторожно, это будет стоить вам памяти.

Вы можете прочитать об этом и скачать образец здесь.