C# Загрузка разных версий сборки в один и тот же проект

Я создаю некоторый инструмент, который выполняет несколько операций, таких как NUnit. Внутри этого инструмента я открываю сборку.dll и вызываю методы для ее запуска.

Все идет хорошо до тех пор, пока мне нужно перезагрузить.dll без перезапуска программы. Идея состоит в том, что когда инструмент запущен, мы копируем требуемую сборку во временную папку и вызываем ее оттуда. Если мне нужно перезагрузить компьютер, я копирую другую в другую временную папку и пытаюсь загрузить только что скопированное из другой папки и загрузить в предыдущий объект сборки

  ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath); 

Но моя проблема в том, что после того, как я изменил AssemblyFullPath на новый и вызвал Assembly.LoadFrom, он возвращает только старую сборку, загруженную в первый раз, но не во вторую! Может быть, проблема в том, что мы не можем загрузить несколько сборок с разными версиями? Каково решение?

3 ответа

Решение

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

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

Чтобы расширить ответ JaredPar, вам нужно будет создать новый AppDomain и использовать Remoting общаться между двумя.

Посетите http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=vs.85).aspx чтобы начать работу.

Попробуйте вот так:

string dllFile = "C:\\sample.dll";
Assembly asmLoader = Assembly.LoadFile(dllFile);
Type[] types = asmLoader.GetTypes();

Поскольку все ресурсы из сборки не могут быть перезагружены / заменены, это ресурсы сборки, пока приложение еще работает. Он будет заменен / удален только при выгрузке приложения или той сборке, в которой оно находится.

Используйте метод LoadFile(). Надеюсь, поможет.

Другие вопросы по тегам