2009-02-25 6 views
3

Ich muss meine CF-App über den Webservice selbst aktualisieren. Ich fand einen Artikel auf MSDN von 2003, der es ziemlich gut erklärt. Ich möchte hier jedoch gerne üben. Hat jemand das schon einmal gemacht oder sind alle auf Lösungen von Drittanbietern angewiesen?Selbstaktualisierung .net CF-Anwendung

Ich wurde speziell gebeten, es auf diese Weise zu tun, also wenn Sie irgendwelche Tipps/Vorbehalte wissen, werden alle Informationen geschätzt.

Danke!

Antwort

1

Was genau meinen Sie mit "Selbstaktualisierung"? Wenn Sie sich auf Konfiguration oder Daten beziehen, sollten Webservices großartig funktionieren. Wenn Sie davon sprechen, automatisch eine neue Version von sich selbst herunterzuladen und zu installieren, ist das eine andere Geschichte.

Gefunden this herunterladbare Probe von Microsoft- sieht aus wie es helfen sollte.

+0

Ich beziehe mich auf beide tatsächlich. http://msdn.microsoft.com/en-us/library/aa446487.aspx dies tut beides, aber es ist ein alter Artikel und ich fragte mich nur, ob jemand praktische Erfahrung damit hatte. – sarsnake

2

Dies ist relativ einfach zu tun. Grundsätzlich ruft Ihre Anwendung einen Webdienst auf, um ihre Version mit der auf dem Server verfügbaren Version zu vergleichen. Wenn die Serverversion neuer ist, lädt Ihre Anwendung die neue EXE als Array byte [] herunter.

Als nächstes, weil Sie eine laufende EXE-Datei nicht löschen oder überschreiben können, benennt Ihre Anwendung ihre ursprüngliche EXE-Datei in etwas wie "MyApplication.old" um (das OS ermöglicht dies glücklicherweise). Ihre App speichert dann das heruntergeladene Array byte [] im selben Ordner wie die ursprüngliche EXE-Datei und mit demselben ursprünglichen Namen (z. B. "MyApplication.exe"). Sie zeigen dann eine Nachricht an den Benutzer (z. B. "neue Version erkannt, bitte neu starten") und schließen.

Wenn der Benutzer die App neu startet, wird die neue Version gestartet. Die neue Version löscht die alte Datei ("MyApplication.old") und das Update ist abgeschlossen.

Eine Aktualisierung der Anwendung selbst, ohne dass der Benutzer neu starten muss, ist ein großer Fehler (Sie müssen einen separaten Prozess starten, um die Aktualisierung durchzuführen, was eine separate Updater-Anwendung bedeutet, die nicht automatisch aktualisiert werden kann) und ich konnte es nie 100% zuverlässig arbeiten lassen. Ich hatte nie einen Kunden, der sich über den erforderlichen Neustart beschwert hat.

+0

danke für die Antwort, in meinem Fall sieht es so aus, als müsste ich es selbst aktualisieren. Der Grund dafür ist, dass unsere Benutzer nicht sehr clever sind und die App nicht updaten können und was am Ende passieren wird, dass wir überall verschiedene Versionen haben werden - das wird sicherlich eine Qual sein. Ich würde mich lieber in den frühen Stadien automatisch damit befassen. – sarsnake

+0

In meinem Fall kann ich die CAB-Datei (cf Installer) vom Server herunterladen und es ist ein Installer, wenn wir auf diese Datei klicken, wird es diese Version auf dem mobilen Gerät installieren. Ich habe versucht, Ihre Antwort, aber es funktioniert nicht es machbar mit kompaktem Rahmen. Bitte antworten Sie. – Royal

+0

@Royal: Ja, der Ansatz ist mit dem kompakten Framework machbar - meine Version funktionierte sogar auf Windows Mobile und normalen Windows. Sie sagen, Sie haben das versucht - stellen Sie Ihren Versuch als Frage hier auf StackOverflow und zeigen Sie mir darauf, und ich werde versuchen zu sehen, was das Problem mit Ihrer Implementierung ist. – MusiGenesis

2

fragte ich diese gleiche Frage eine Weile zurück: How to Auto-Update Windows Mobile application

Grundsätzlich benötigen Sie zwei Anwendungen.

App1: Startet die eigentliche Anwendung, prüft aber auch auf eine CAB-Datei (Installer). Wenn die CAB-Datei vorhanden ist, wird die CAB-Datei ausgeführt.

App2: Tatsächliche Anwendung. Es ruft einen Webdienst auf, übergibt eine Versionsnummer an den Dienst und ruft eine URL zurück, wenn eine neue Version existiert(). Nach dem Herunterladen können Sie optional die CAB-Datei installieren und herunterfahren.

Ein potentielles Problem: Wenn Sie Dateien haben, die eine Installation auf das Dateisystem stellt, aber nicht überschreiben kann (Datenbankdatei, Protokoll usw.), benötigen Sie zwei separate Installationen.

Um ein Taxi zu installieren: aufblicken wceload.exe http://msdn.microsoft.com/en-us/library/bb158700.aspx

private static bool LaunchInstaller(string cabFile) 
    { 
     // Info on WceLoad.exe 
     //http://msdn.microsoft.com/en-us/library/bb158700.aspx 
     const string installerExe = "\\windows\\wceload.exe"; 

     const string processOptions = ""; 
     try 
     { 
      ProcessStartInfo processInfo = new ProcessStartInfo(); 
      processInfo.FileName = installerExe; 
      processInfo.Arguments = processOptions + " \"" + cabFile + "\""; 

      var process = Process.Start(processInfo); 
      if (process != null) 
      { 
       process.WaitForExit(); 
      } 

      return InstallationSuccessCheck(cabFile); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Sorry, for some reason this installation failed.\n" + e.Message); 
      Console.WriteLine(e); 
      throw; 
     } 
    } 

    private static bool InstallationSuccessCheck(string cabFile) 
    { 
     if (File.Exists(cabFile)) 
     { 
      MessageBox.Show("Something in the install went wrong. Please contact support."); 

      return false; 
     } 
     return true; 
    } 

die Versionsnummer zu erhalten. Assembly.GetExecutingAssembly() GetName() Version..(ToString)

Um ein Taxi herunterladen:

 public void DownloadUpdatedVersion(string updateUrl) 
    { 
     var request = WebRequest.Create(updateUrl); 
     request.Credentials = CredentialCache.DefaultCredentials; 
     var response = request.GetResponse(); 

     try 
     { 
      var dataStream = response.GetResponseStream(); 
      string fileName = GetFileName(); 
      var fileStream = new FileStream(fileName, FileMode.CreateNew); 

      ReadWriteStream(dataStream, fileStream); 
     } 
     finally 
     { 
      response.Close(); 
     } 
    } 
0

Wenn Sie ein Drittanbieter-Komponente verwenden möchten, haben Sie einen Blick auf AppToDate von den Jungs bei MoDaCo entwickelt.