2009-02-25 81 views
3

我需要通过Web服务使我的CF应用程序自我更新。 我在2003年的MSDN上发现了一篇文章,对它进行了很好的解释。不过,我想在这里谈谈实践。以前是否有人真的做过,或者每个人都依赖第三方解决方案?自我更新.net CF应用程序

我已被特意要求这样做,所以如果你知道任何提示/警告,任何信息表示赞赏。

谢谢!

回答

1

“自我更新”是什么意思?如果你指的是配置或数据,那么Web服务应该很好。如果你正在谈论自动下载和安装自己的新版本,这是一个不同的故事。

找到this从Microsoft下载的示例 - 看起来应该有所帮助。

+0

我指的是实际上。 http://msdn.microsoft.com/en-us/library/aa446487.aspx 这既是,但它是一篇旧文章,我只是想知道是否有人有实际经验。 – sarsnake 2009-02-25 18:31:19

2

这样做相对容易。基本上,您的应用程序会调用Web服务来将其版本与服务器上提供的版本进行比较。如果服务器版本较新,您的应用程序将新的EXE作为byte []数组下载。

接下来,由于您无法删除或覆盖正在运行的EXE文件,因此您的应用程序会将其原始EXE文件重命名为“MyApplication.old”(操作系统允许此操作)。然后,您的应用程序将下载的byte []数组保存在与原始EXE文件相同的文件夹中,并使用相同的原始名称(例如“MyApplication.exe”)。然后您向用户显示一条消息(例如“检测到新版本,请重新启动”)并关闭。

当用户重新启动应用程序时,它将是他们开始的新版本。新版本删除旧文件(“MyApplication.old”),更新完成。

让应用程序更新本身而不需要用户重启是一个巨大的痛苦(你必须启动一个单独的进程来完成更新,这意味着一个单独的更新应用程序本身不能自动更新)我从来没有能够100%可靠地工作。我从来没有让客户抱怨需要重新启动。

+0

感谢您的答案,在我看来,我将不得不自己更新。原因是因为我们的用户不是非常精明,并且可能不会更新应用程序,最终会发生什么,我们将在各地都有不同的版本 - 这肯定会让人感到痛苦。我宁愿在早期阶段自动处理它。 – sarsnake 2009-06-08 17:15:08

2

我问这个同样的问题而回: How to Auto-Update Windows Mobile application

基本上你需要两个应用程序。

App1:启动实际应用程序,但也检查CAB文件(安装程序)。如果cab文件在那里,它会执行CAB文件。

App2:实际应用。它将调用Web服务,将版本号传递给服务,并在存在新版本时检索URL()。下载后,您可以选择安装cab文件并关闭。

一个问题:如果你有一个安装在文件系统上的文件,但不能覆盖(数据库文件,日志等),则需要两次单独安装。

要安装的驾驶室:查找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; 
    } 

要获取的版本号:Assembly.GetExecutingAssembly()的GetName()版本。的ToString()

要下载驾驶室:

 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

如果你想使用一个第三方组件,看看AppToDate通过的MoDaCo的人开发的。