Подтвердить что ты не робот

Горячая выгрузка/перезагрузка DLL, используемая приложением

У меня есть приложение, которое загружает DLL для выполнения определенной части обработки

Example : "Application.dll" loading "Process.dll" 

Process.dll динамически загружается в Runtime, используя отражение и не ссылаясь на приложение.

После завершения обработки DLL необходимо перекомпилировать на сервере и снова загрузить обратно.
Чтобы сделать это, мне нужно его освободить, иначе я получаю следующее сообщение: "Невозможно скопировать файл" Process.dll "в" Process.dll ". Процесс не может получить доступ к файлу" Process.dll ", потому что он используется другим процессом.

Итак, вопрос: как программно освободить/освободить/выгрузить Process.dll из моего приложения, прежде чем загружать его обратно. Конечно, все дело в том, чтобы сделать это БЕЗ остановки приложения.

РЕДАКТИРОВАТЬ 1:

Предлагаемое решение выглядит следующим образом:

AppDomain newDomain4Process = AppDomain.CreateDomain("newDomain4Process");
Assembly processLibrary = newDomain4Process.Load("Process.dll");
AppDomain.Unload(newDomain4Process);

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

ИЗМЕНИТЬ 2:

Этот пост спас мне жизнь, вот код:

class ProxyDomain : MarshalByRefObject
    {
        public Assembly GetAssembly(string AssemblyPath)
        {
            try
            {
                return Assembly.LoadFrom(AssemblyPath);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

   ProxyDomain pd = new ProxyDomain();
   Assembly a = pd.GetAssembly(FullDLLPath);

РЕДАКТИРОВАТЬ 3:
Я не получил доступ к AppDomain и выгрузил его с помощью предыдущего решения. Когда я использовал классический метод AppDomain Creation, я почувствовал, что Алексей предупреждает: AppDomain.Unload "казалось" работать, но сборка все еще была загружена (Module View). Поэтому у меня все еще есть проблема, так как я не могу эффективно выгрузить DLL.

4b9b3361

Ответ 1

Прошло довольно много времени, так как я посмотрел на это, но я уверен, что вам нужно будет создать новый AppDomain а затем загрузите DLL внутри.

Причина в том, что вы не можете выгружать Assembly сам, но вы можете выгрузить AppDomain, который содержит Assembly.

Вот статья CodeProject, в которой описывается, как это сделать: Чтобы выгрузить исполняемую DLL

Ответ 2

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

Ответ 3

Пока вы, кажется, решаете проблему в соответствии с вашим правлением, вот пара комментариев:

Следите за тем, чтобы объекты из вашего Process.dll "просачивались" в основной AppDomain. То есть что-то вроде броска пользовательского исключения, определенного в Process.dll и попавшего в основной AppDomain, заставит Process.dll загрузиться в основной AppDomain. Проверьте список загруженных сборок в основном AppDomain после выполнения интересующих вас операций.

Разгрузка AppDomain может завершиться неудачей и может занять много времени.