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