Я работаю над тем, чтобы сервис Windows автоматически перезапускал приложение при появлении новой версии.Мой код ниже, и это на самом деле работает.Мой вопрос таков: где-то здесь есть большое нет-нет?Я новичок в создании доменов приложений в отдельных потоках, и я хотел бы знать, есть ли более элегантный способ сделать это.Я также обеспокоен тем, что, возможно, у меня есть большое слепое пятно относительно того, как я справляюсь с этим.Любой совет приветствуется.
Есть две основные части: служба Windows, которая запускается, запускает мое приложение в другом процессе, а затем опрашивает, чтобы определить, доступна ли новая версия этого приложения.Вторая часть - это фактическое приложение, которое запускается, обновляется, перезапускается.
Сначала, когда служба запускается, она вызывает LoadApp (), чтобы приложение запускалось.
private void LoadApp()
{
// ** appDomainSetup here **
this._appDomain = AppDomain.CreateDomain("MyUpdatedApp", AppDomain.CurrentDomain.Evidence, appDomainSetup);
this._tokenSource = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
try
{
this._appDomain.ExecuteAssembly(assembly);
}
catch (AppDomainUnloadedException ex)
{
Debug.WriteLine(ex.ToString());
}
}, _tokenSource.Token);
}
Затем, каждые 10 секунд, таймер вызывает этот метод:
private void Process(object stateInfo)
{
if (!Monitor.TryEnter(_locker)) { return; }
try
{
// Check for new binaries. If new, copy the files and restart the app domain.
if (!NewAppVersionReady()) { return; }
DeleteFiles();
CopyFiles();
RestartAppDomain();
}
finally
{
Monitor.Exit(_locker);
}
}
RestartAppDomain () выглядит следующим образом.Обратите внимание, что я получаю исключение при выгрузке домена приложения во второй строке этого метода.(Я обхожу это, перехватывая исключение и в основном игнорируя его.)
private void RestartAppDomain()
{
this._tokenSource.Cancel();
AppDomain.Unload(this._appDomain);
LoadApp();
}
Edit: с тех пор я обнаружил, что строка AppDomain.Unload () не нужна.Без этого служба по-прежнему обновляет приложение новой версией, а затем запускает новую версию приложения.Моя большая проблема - вызывать Cancel () в источнике токена.Мне бы хотелось, чтобы приложение могло корректно завершать работу, а не просто закрывать его.