Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Nikola PejicОтветов: 1

Я пытаюсь установить какое-то приложение для автоматического обновления. Идея состоит в том, чтобы иметь неизменяемый код, который будет ссылаться на 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, потому что она используется. Я читал, что не могу удалить его напрямую из сборки, но могу загрузить его в домен приложения, а затем выгрузить домен приложения. Тем не менее, я пытался это сделать, но, похоже, у меня это не работает.

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

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

appdomainruntimedll

Ответы

Ответ 1 · Nikola Pejic

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы