Как загрузить DLL во время выполнения в приложении С#, вызвать метод, но затем выгрузить его?

Я пытаюсь установить какое-то приложение для автоматического обновления. Идея состоит в том, чтобы иметь неизменяемый код, который будет ссылаться на DLL со всей логикой, содержащейся в DLL. По сути, он будет работать, просматривая обновления каждые 5 минут. Если доступно обновление, вызывается метод dispose, который удаляет все из DLL, затем загружает новую DLL и ссылается на нее, а затем запускает метод запуска.

У меня есть что-то вроде этого:

var DLL = Assembly.LoadFile(path_to_appdata+"dll_name.dll");

runner_dll = DLL.GetType("dll_namespace_name.Manager");
var c = Activator.CreateInstance(runner_dll);
var method = runner_dll.GetMethod("run_client");
method.Invoke(c, new object[] { });             

и это работает. Однако дело в том, что я не могу обновить DLL, потому что она используется. Я читал, что не могу удалить его напрямую из сборки, но могу загрузить его в домен приложения, а затем выгрузить домен приложения. Тем не менее, я пытался это сделать, но, похоже, у меня это не работает.

Любая помощь будет очень признательна.


person Nikola Pejic    schedule 18.07.2020    source источник
comment
Как рекурсивно загрузить сборку в AppDomain со всеми ссылками?. Но вы можете предпочесть AddIn (расширение), см. Управляемая платформа расширяемости (MEF). MAF исчез.   -  person Jimi    schedule 18.07.2020
comment
В этом случае, возможно, несколько процессов лучше. Вы можете использовать загрузчик для управления обновлением, независимо от того, является ли это графическим интерфейсом, сервисом или фоновым исполняемым файлом. Exes используют RPC или канал для связи друг с другом.   -  person neohope    schedule 20.07.2020
comment
@neohope Я думаю, это то, что я собираюсь сделать. Слишком сложно ссылаться на все библиотеки DLL, но, с другой стороны, на исполняемые файлы гораздо проще. Я создам консольное приложение со всеми функциями DLL, запущу его из службы, затем оно будет работать в фоновом режиме и делать то, что должно.   -  person Nikola Pejic    schedule 20.07.2020


Ответы (1)


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

person Nikola Pejic    schedule 20.07.2020