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(). Надеюсь, поможет.