2009-02-25 4 views
3

Je dois mettre à jour automatiquement mon application CF via le service Web. J'ai trouvé un article sur MSDN de 2003 qui explique assez bien. Cependant, j'aimerais parler de pratique ici. Est-ce que tout le monde l'a vraiment fait avant ou est-ce que tout le monde compte sur des solutions tierces?Mise à jour automatique de l'application .net CF

On m'a spécifiquement demandé de le faire de cette façon, donc si vous connaissez des conseils/avertissements, toute information est appréciée.

Merci!

Répondre

1

Que voulez-vous dire par "mise à jour automatique"? Si vous faites référence à la configuration ou aux données, les services Web devraient fonctionner correctement. Si vous parlez de télécharger automatiquement et d'installer une nouvelle version de lui-même, c'est une histoire différente.

Trouvé this échantillon téléchargeable de Microsoft- il semble qu'il devrait aider.

+0

Je fais référence aux deux en fait. http://msdn.microsoft.com/en-us/library/aa446487.aspx cela fait les deux, mais c'est un vieil article et je me demandais si quelqu'un avait une expérience pratique. – sarsnake

2

Ceci est relativement facile à faire. Fondamentalement, votre application appelle un service Web pour comparer sa version avec la version disponible sur le serveur. Si la version du serveur est plus récente, votre application télécharge le nouvel EXE en tant que tableau byte [].

Ensuite, parce que vous ne pouvez pas supprimer ou écraser un fichier EXE en cours d'exécution, votre application renomme son fichier EXE d'origine pour quelque chose comme "MyApplication.old" (le système d'exploitation le permet, heureusement). Votre application enregistre ensuite le tableau byte [] téléchargé dans le même dossier que le fichier EXE d'origine et avec le même nom d'origine (par exemple "MyApplication.exe"). Vous affichez ensuite un message à l'utilisateur (par exemple, "nouvelle version détectée, veuillez redémarrer") et fermez. Lorsque l'utilisateur redémarre l'application, il s'agit de la nouvelle version démarrée. La nouvelle version supprime l'ancien fichier ("MyApplication.old") et la mise à jour est terminée. Avoir une mise à jour de l'application sans que l'utilisateur ait besoin de redémarrer est une énorme douleur dans la crosse (vous devez lancer un processus séparé pour effectuer la mise à jour, ce qui signifie qu'une application de mise à jour séparée ne peut pas être mise à jour automatiquement) et je n'ai jamais réussi à le faire fonctionner de manière fiable. Je n'ai jamais eu un client se plaindre du redémarrage requis.

+0

merci pour la réponse, dans mon cas, il semble que je vais devoir le faire auto-mise à jour. la raison en est que nos utilisateurs ne sont pas très avertis et pourraient ne pas mettre à jour l'application et ce qui finira par se produire que nous aurons des versions différentes partout - ce sera une douleur dans les fesses à coup sûr. Je préférerais l'aborder automatiquement dès les premières étapes. – sarsnake

+0

Dans mon cas, je peux télécharger le fichier .cab (cf installateur) du serveur et c'est un installateur si nous cliquons sur ce fichier, il va installer cette version sur un appareil mobile.J'ai essayé votre réponse, mais cela ne fonctionne pas.Est-ce il est possible avec un cadre compact. S'il vous plaît répondre. – Royal

+0

@Royal: oui, l'approche est faisable avec le framework compact - en fait, ma version de cela fonctionnait à la fois sur Windows Mobile et sur Windows. Vous dites que vous avez essayé de le faire - postez votre tentative comme une question ici sur StackOverflow et pointez-moi dessus, et je vais essayer de voir quel est le problème avec votre implémentation. – MusiGenesis

2

J'ai posé cette même question un certain temps: How to Auto-Update Windows Mobile application

Fondamentalement, vous avez besoin de deux applications.

App1: Lance l'application actuelle, mais vérifie également la présence d'un fichier CAB (programme d'installation). Si le fichier CAB est là, il exécute le fichier CAB.

App2: Application réelle. Il appelle un service Web, transmet un numéro de version au service et récupère une URL si une nouvelle version existe(). Une fois téléchargé, vous pouvez éventuellement installer le fichier cab et éteindre. Un problème potentiel: si vous avez des fichiers installés par une installation sur le système de fichiers, mais que vous ne pouvez pas les remplacer (fichier de base de données, journal, etc.), vous aurez besoin de deux installations distinctes.

Pour installer un taxi: rechercher 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; 
    } 

Pour obtenir le numéro de version. Assembly.GetExecutingAssembly() getName() Version..ToString()

Pour télécharger un taxi:

 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

Si vous voulez utiliser un composant tiers, un coup d'oeil à AppToDate développé par les gars de MoDaCo.

Questions connexes