2011-01-04 3 views
5

Ich habe einen Windows-Dienst erstellt, jetzt möchte ich, dass er automatisch aktualisiert wird. Ich habe über das Erstellen eines zweiten Dienstes gelesen, um das zu tun, oder ein anderes Programm, kann nicht verwenden, klicken Sie auf eins, was ist mit myBuild? Weiß jemand das? Was ist der beste Weg? Kann ich nur Baugruppen wechseln?Automatische Aktualisierung eines Windows-Dienstes

Antwort

5

Wenn Sie Ihren Dienst zu laufen, während Sie ein Update durchführen, hier ist das, was ich vor, dies zu erreichen getan hatte:

  1. Setzen Sie Ihre Logik update in eine separate DLL.
  2. Erstellen Sie eine AppDomain in Ihrem Service.
  3. Datei-Monitor erstellen, die ein Ereignis ausgelöst wird, wenn Sie kopieren die Datei (Sie MSFT Ent Lib Updates verwenden können)
  4. die alte dll Unload während Blockierung (Warteschlange) die Fäden, die Sachen aus dieser dll
  5. Last in die execute neue DLL-Datei in die App-Domäne.
  6. Lassen Sie Ihre Threads wissen, um die Verarbeitung fortzusetzen.
3
  1. Laden Sie die neue EXE und alle zusätzlichen Assemblys herunter.
  2. Benennen Sie die vorhandene Baugruppe um.
  3. Kopieren Sie Ihre neue Baugruppe.
  4. Dienst neu starten. Sie können die Service-Neustart-Funktion in Ihrer Hauptdienst-Exe erstellen.
  5. Wenn der Dienst startet, suchen Sie nach umbenannten Dateien aus Schritt 2 und löschen Sie sie, um sie zu bereinigen.

Ihren Dienst neu zu starten tun

System.Diagnostics.Process.Start 
    (System.Reflection.Assembly.GetEntryAssembly().Location) 

Dann in Ihrem Dienst tut

private const string _mutexId = "MyUniqueId"; 
    private static Mutex _mutex; 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
     try 
     { 
      bool alreadyRunning = false; 
      try 
      { 
       Mutex.OpenExisting(_mutexId); 
       alreadyRunning = true; 
      } 
      catch (WaitHandleCannotBeOpenedException) 
      { 
       alreadyRunning = false; 
      } 
      catch 
      { 
       alreadyRunning = true;     
      } 
      if (alreadyRunning) 
      { 
       using (ServiceController sc = new ServiceController("MyServiceName")) 
       { 
        sc.Stop(); 
        sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 120)); 
        sc.Start(); 
       } 
       return; 
      } 
     } 
     catch 
     { 
     } 
     _mutex = new Mutex(true, _mutexId); 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
     // Load the service into memory. 
     ServiceBase.Run(ServicesToRun); 
     _mutex.Close(); 
    } 
1

Sie Ihren Windows-Dienst ändern könnten, so dass es einfach ein Läufer für die Hauptanwendung ist, und hat die Funktionalität, um Ihre Hauptanwendung zu aktualisieren.

So würden Sie haben:

  • Service.exe: Führt Application.exe überwacht Remote-Standort für Updates Application.exe. Sendet Start-/Stop-Ereignisse an Application.exe

  • Application.exe: Was war Ihre Service.exe. Ruft Ereignisse zum Starten/Stoppen auf.

+0

... sorry, wahrscheinlich nicht sehr gut erklärt. SO Antworten um 3 Uhr morgens zu schreiben ist wahrscheinlich nicht die beste Idee;) –