Горячая выгрузка/перезагрузка 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.
Ответы
Ответ 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 может завершиться неудачей и может занять много времени.