Самообновление / теневое копирование с помощью Asp.Net сердечник


Я пишу a Asp.Net основное приложение, которое должно иметь возможность обновлять себя (заменять свои собственные двоичные файлы во время работы).

Эта статья MSDN описывает теневое копирование с помощью классической платформы .Net framework, что было бы именно тем, что мне нужно. Но вся вещь AppDomain отсутствует в .Net Core.

Итак, мои вопросы:

  • существует ли альтернативный способ в .Net Core включить теневое копирование сборок?
  • существуют ли другие механизмы в .Net Ядро, позволяющее построить самообновляющееся приложение?
3 5

3 ответа:

В .NET Core нет встроенных средств теневого копирования

Поскольку в .NET Core нет встроенного механизма для этого, я в конечном итоге реализовал свое собственное пользовательское решение. Это работает примерно так:

  1. запущенное приложение загружает и извлекает новые двоичные файлы в новую папку.
  2. запущенное приложение запускает небольшой процесс обновления. Следующие параметры передаются процессу обновления через командную строку:
    • идентификатор процесса запущенного приложения
    • двоичный путь бега применение
    • Путь загруженных двоичных файлов
  3. запущенное приложение завершает работу само.
  4. Процесс обновления ожидает выхода запущенного приложения (используя идентификатор процесса) или принудительно убивает запущенное приложение, если оно не выходит само по себе в течение заданного времени ожидания.
  5. Процесс обновления удаляет существующие двоичные файлы и копирует новые загруженные двоичные файлы.
  6. Процесс обновления запускает новую версию основного приложение.

Убедитесь, что вы делаете как можно больше в главном приложении (загрузка, распаковка, проверка,...) и максимально упростить процесс обновления (свести к минимуму риск сбоя).

Этот подход оказался достаточно устойчивым.

.Net API Browser указывает, что свойство, необходимое для настройки этого в .Net Core, но AppDomainSetup-нет.

Чтобы было понятно, AppDomain был добавлен в .Net Standard 2.0, но создание домена в настоящее время не поддерживается