2010-08-23 3 views
2

У меня есть приложение, которое работает на моем компьютере и компьютерах моих коллег на работе. Я иногда выталкиваю обновления для этого приложения и хочу, чтобы приложение обнаружило это автоматически (возможно, через базу данных), и выключилось и снова открылось для установки новых обновлений.Запуск приложения WinForm?

Я знаю, как я могу закрыть приложение, но не знаю, как я могу вновь открыть его, потому что, когда он не работает, я не знаю, как выполнить любой код ...

+0

Это звучит как слэм данк для мыши один раз, особенно если вы используете ссылку я отправил в ответ Флетчера, чтобы проверить, в то время как программа работает. Добавьте комментарий, если по какой-то причине clickonce не работает для вас. –

ответ

3

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

Единственный способ узнать, требовалось ли приложение для обновления, пока данное приложение все еще работает, - опросить файл развертывания ClickOnce на сервере и сравнить номер версии с текущим развертыванием. Не рекомендуется.

Edit:

Другой способ гарантировать, что пользователи всегда имеют самую свежую версию, чтобы не включать в себя постоянный файл развертывания и заставить пользователя всегда работать со страницы запуска на своем сайте. Это будет только блюдо из последней и самой большой версии.

+2

http://msdn.microsoft.com/en-us/library/ms404263.aspx рассказывает о том, как настроить clickonce для проверки обновлений с указанными интервалами. –

+0

ClickOnce продолжает удивлять меня. Я продолжаю находить сообщения об этих небольших функциях. – fletcher

+0

ClickOnce и руководство по проверке метода обновлений, описанного в этой ссылке MS, замечательно, однако по какой-либо причине метод Application.restart() отключает приложение, но затем фактически не возвращает его обратно. – Ads

1

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

В качестве альтернативы, если приложение может обновляться при его открытии, зачем ему нужно завершить работу? Не может ли он просто освободить любые ресурсы, которые он использует и т. Д., И выполнить обновление.

+0

Недостатком «когда он открывается» является то, что пользователь может держать приложение открытым в течение длительного времени, в течение нескольких недель подряд, если они спячки на своем компьютере или заблокируют его, когда они закончили с ним, вместо того, чтобы отключать его. Иногда требуется что-то более активное. – Rob

+0

Согласен. Но, похоже, его приложение не нужно закрывать для обновления, поскольку оно обновляется при запуске - просто спрашивает, почему он не может обновить себя в любое время с небольшим управлением ресурсами. –

1

Процесс вам действительно нужно иметь что-то вроде этого:

  1. Применение детектирует требуется обновление и выполняет обновление приложения, а затем выходит из себя
  2. обновления загружает приложение и устанавливает обновление
  3. Обновление приложения перезапускает «основное» приложение

«Обновление приложения» может потребоваться для административных прав, если вы обновляете файлы на Vista/Windows7 из-за UAC, поэтому вы, вероятно, захотите встроить манифест, чтобы помочь решить эту проблему.

Чтобы запустить другой процесс, код, который вы хотите, чтобы выполнить это System.Diagnostics.Process.Start(), например:

Process p = new Process(); 
p.StartInfo.FileName = "C:\\Windows\\System32\cmd.exe"; 
p.Start(); 
0

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

0

У меня была аналогичная проблема, но моя была связана с неуправляемой утечкой памяти, которую я не мог найти в приложении, которое должно работать 24/7. С клиентом я согласился с тем, что безопасное время для перезапуска приложения было 3:00 утра, если потребление памяти превысило определенное значение.

Я пробовал Application.Restart, но так как он использует какой-то механизм, который запускает новый экземпляр, пока он уже запущен, я пошел на другую схему. Я использовал трюк, который обрабатывает файловая система, до тех пор, пока не завершится процесс их создания. Итак, из приложения я сбросил файл на диск и не сделал Dispose() дескриптор. Я использовал файл для отправки «сам» исполняемого файла и начала директории (чтобы добавить гибкость).

Код:

_restartInProgress = true; 
string dropFilename = Path.Combine(Application.StartupPath, "restart.dat"); 
StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)); 
sw.WriteLine(Application.ExecutablePath); 
sw.WriteLine(Application.StartupPath); 
sw.Flush(); 
Process.Start(new ProcessStartInfo 
{ 
    FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"), 
    WorkingDirectory = Application.StartupPath, 
    Arguments = string.Format("\"{0}\"", dropFilename) 
}); 
Close(); 

Close() в конце будет инициировать приложение остановки, и дескриптор файла я использовал для StreamWriter здесь будет проводиться открытым, пока процесс действительно не умирает. Затем ...

Restarter.exe вступает в действие. Он TRIES читает файл в эксклюзивном режиме, не позволяя ему получить доступ до тех пор, пока основное приложение не будет мертвым, затем запустит основное приложение, удалит файл и будет существовать. Я предполагаю, что это не может быть проще:

static void Main(string[] args) 
{ 
    string filename = args[0]; 
    DateTime start = DateTime.Now; 
    bool done = false; 
    while ((DateTime.Now - start).TotalSeconds < 30 && !done) 
    { 
     try 
     { 
      StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)); 
      string[] runData = new string[2]; 
      runData[0] = sr.ReadLine(); 
      runData[1] = sr.ReadLine(); 
      Thread.Sleep(1000); 
      Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] }); 
      sr.Dispose(); 
      File.Delete(filename); 
      done = true; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     Thread.Sleep(1000); 
    } 
} 
+0

Это кажется хорошим ответом на проблему Application.Restart(), однако при использовании ClickOnce запуск исполняемого файла приложения напрямую вызывает другие проблемы. Возможно, мне придется исследовать, как «правильно» перезапустить приложение ClickOnce в рамках, описанных выше. – Ads

Смежные вопросы