Заменить сборку во время выполнения с помощью .NET.
Есть ли способ с плагиновой системой (я бы использовал с контейнером IoC), чтобы загрузить одну версию сборки во время выполнения, а затем заменить эту DLL во время работы AppDomain? Я не хочу перезапускать приложение.
Помогает ли MEF что-то вроде этого?
Ответы
Ответ 1
Это, по сути, то, что делает NUnit (или, по крайней мере, я не был в коде в то время). Но он делает это, загружая тестовую сборку в другой AppDomain, вызывая код в этом домене, используя метод DoCallback
AppDomain, а затем перезагружает тестовую сборку, если она перекомпилирована.
Итак, пока вы не можете выгружать или перезагружать DLL, но вы можете выгружать и перезагружать приложение и выполнять код в нем.
Ответ 2
Невозможно использовать чистую .net, потому что нет способа выгрузить сборку из домена. Поскольку MEF написан в управляемом коде, я сомневаюсь, что это возможно. Я решил эту проблему, загрузив сборку в отдельный домен, и когда я захочу ее перезагрузить, я остановил ее и начал снова.
Ответ 3
http://msdn.microsoft.com/en-us/library/ms173101(v=VS.90).aspx
http://people.oregonstate.edu/~reeset/blog/archives/466
Ответ 4
Похоже, эта статья CodeProject объясняет, как это сделать. Этот вопрос на форумах MSDN кажется похожим, и этот вопрос SO показывает, как это сделать Это. Все эти ссылки предупреждают о том, что утечки создаются из-за проблем с правильной настройкой AppDomains, поэтому покупатель остерегается.
Ответ 5
Вы не можете выгружать DLL из работающего домена приложения. Что вы можете сделать, это использовать MEF и подготовить приложение для обработки нескольких реализаций. В этом случае вы можете скопировать новую dll (новую реализацию интерфейса, модуля и т.д.) В папку MEF, перекомпоновать и использовать ее. Но, осторожно, это будет стоить вам памяти.
Вы можете прочитать об этом и скачать образец здесь.