Я использую вариант 1. В настоящее время процесс обновления обновляется очень редко. Он использует XML-файл, содержащий информацию о том, где получить файлы (в настоящее время поддерживает SVN, работает над добавлением поддержки NuGet) и где их разместить. В нем также указывается, какие из них являются службами, а какие - веб-сайтами, и указывается название службы, используемой для каждого проекта.
Процесс опрашивает источник, если доступна новая версия, он копирует ее в каталог с новой версией с номером и затем обновляет службу. Он также сохраняет 5 копий каждого обновления, что упрощает откат в случае возникновения проблемы.
Вот основной фрагмент кода для программы обновления, которая останавливает существующую службу, копирует файлы и затем перезапускает ее.
if (isService)
{
log.Debug("Stopping service " + project.ServiceName);
var service = GetService(project);
if (service != null &&
service.Status != System.ServiceProcess.ServiceControllerStatus.Stopped && service.Status != System.ServiceProcess.ServiceControllerStatus.StopPending)
{
service.Stop();
}
service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped, new TimeSpan(0, 1, 0));
if (service.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
log.Debug("Service stopped");
else
log.Error("ERROR: Expected Stopped by Service is " + service.Status);
}
log.Debug("Copying files over");
CopyFolder(checkoutDirectory, destinationDirectory);
if (isService)
{
log.Debug("Starting service");
var service = GetService(project);
// Currently it doesn't create services, you need to do that manually
if (service != null)
{
service.Start();
service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, 1, 0));
if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running)
log.Debug("Service running");
else
log.Error("Service " + service.Status);
}
}