2009-02-25 84 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的人開發的。