C# загрузите разные версии сборки в один и тот же проект
Я создаю инструмент, который выполняет несколько операций, таких как NUnit. Внутри этого инструмента я открываю .сборка dll и методы вызова формируют его для запуска некоторого теста.
все идет хорошо до тех пор, пока мне не нужно перезагрузить.dll с перезапуском программы. Идея заключается в том, что при запуске инструмента мы копируем требуемую сборку в некоторую временную папку и вызываем оттуда. Если мне нужно перезагрузить, я копирую другой в другую временную папку и пытаюсь загрузить недавно скопированный из другой папки и загрузить в предыдущий объект сборки
ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath);
но моя проблема в том, что после того, как я изменю AssemblyFullPath на новый и вызову сборку.LoadFrom возвращает только старую сборку, которая была загружена в первый раз, но не во второй! Может быть, проблема в том, что мы не можем загрузить несколько сборок с разными версиями? Каково решение?
3 ответов
среда CLR поддерживает загрузку нескольких версий строго именованных сборок в одну и ту же AppDomain
. Это работает только в том случае, если ваши сборки имеют строгое имя и каждая из них имеет другую версию.
Я предполагаю, что более вероятно, что вы имеете дело с неподписанными сборками. Если это так, то что вы просите не возможно. Как только данная сборка загружается в AppDomain
Он останется там до AppDomain
выгружается. Чтобы заставить это работать, вам придется абстрагироваться от всей работы вокруг загруженных сборок в отдельный AppDomain
и использовать новые AppDomain
для каждой сборки
чтобы расширить ответ JaredPar, вам нужно будет создать новый AppDomain
и использовать Remoting
для связи между ними.
проверить http://msdn.microsoft.com/en-us/library/kwdt6w2k (v=против 85).aspx чтобы помочь вам начать.
попробуйте так:
string dllFile = "C:\sample.dll";
Assembly asmLoader = Assembly.LoadFile(dllFile);
Type[] types = asmLoader.GetTypes();
поскольку все ресурсы сборки не могут быть перезагружены / заменены, это ресурсы сборки во время работы приложения. Он будет заменен / удален только при выгрузке приложения или сборки, которая его содержит.
используйте метод LoadFile (). Надеюсь, это поможет.