2009-07-31 59 views
11

我們有一個最小的'updater'exe文件,用於在啓動實際應用程序之前檢查遠程URL是否有更新,下載它們並替換磁盤上的文件。但是,如果我們想要替換更新程序EXE,那麼AFAIK有兩種選擇:實現自更新軟件的最佳方法

1)Shadow Copying Assemblies由此.Net將創建EXE(和任何引用的程序集)的影子副本並加載這些程序集,陰影組件可以被替換,並且將在下次啓動應用程序時使用。

2)確定哪些文件被替換並在磁盤上重命名/移動它們。 Windows似乎允許重命名/移動鎖定的文件,所以我們可以移動這些文件並複製到新的程序集中。再次,在下次啓動應用程序時,我們將啓動新的程序集。這種方法被提及here

這是第二種方法推薦的方法?這種方法有沒有陷阱?

回答

6

另一種選擇:當主應用程序想要更新自身時,它會生成一個新的更新程序進程,然後關閉自身。同時生成的進程等待主應用程序關閉(進程消失),然後更新所有必需的文件(包括.exe)。之後,它只需重新啓動主應用程序並退出更新程序進程。

+0

聽起來合理 – jpierson 2012-04-25 16:59:40

+0

@jpierson和它的作品:)。我已經使用這種方法已有2年,現在可以用於我自己的應用程序。 – 2012-04-25 18:53:30

8

我使用第二種方法沒有任何問題。只要確保下載的程序集已正確下載。 ;)

運行Update.exe並讓它這樣做:
1.下載新的Update.exe作爲update.ex_
2.重命名的Update.exe到update.bak(你可以將其重命名,但不能覆蓋它)
3.重命名update.ex_到Update.exe的
4.重新啓動Update.exe的

林沒有在所有所以它的測試問題,這樣做的,在生活環境中的約400家客戶正在運行正如我們所說的。

+0

我將如何重新啓動當前正在運行的程序?有一個簡單的方法嗎? – chillitom 2010-08-27 15:05:25

+0

@chilitom:process.start(Application.StartupPath&「\ myprogram.exe」):end – Stefan 2010-08-27 15:13:30

+0

+1在步驟#2中註釋 – jpierson 2012-04-25 17:00:20

1

我們和我們的內部應用程序做到這一點:

應用程序快捷方式指向的更新。

  1. 顯示停機時間通知/截止日期消息。
  2. 更新程序執行更新檢查。
  3. 更新已下載並安裝。
  4. 應用程序啓動。
  5. 應用程序執行更新程序的更新(在/更新文件夾Updater.fp7.gz檢查)

編輯:糟糕 - 錯過步驟5.

3

在一個項目中我的工作,在那裏有2個可執行文件。讓我們稱它們爲A和B.

A存在的唯一原因是啓動B. 因此,當B('真實'應用程序)下載更新時,它能夠在必要時替換A.

如果應用程序被重新啓動(通過),A檢查當B下載了一些文件,並替換他們就開始B.

0

之前,我大多是除了它可能無法正常工作Stefan's Answer同意,如果你想正確在Windows Vista或Windows 7上處理UAC,並且您的應用程序已正確安裝在Program Files文件夾下,或需要安裝其他需要提升權限的依賴項。

在這種情況下,你要麼做一個基於MSI的安裝/補丁或安裝必要的安全運行在Program Files文件夾覆蓋文件的Windows服務。

,如果你的應用是互動的另一種選擇是做的伊戈爾Brejc建議,併產生新的進程,做這給你的應用程序有機會提示更新過程中提升權限的更新。不管場景如何(交互式/非交互式),使用上述修補程序或Windows服務選項可以提供更好的用戶體驗。