2012-01-20 27 views
19

發射器在遊戲中最常見。想想英雄聯盟,星際爭霸II,或者幾乎所有的MMO。在開始真正的遊戲之前,你有一個小型的啓動程序,負責更新和打補丁。應用程序啓動器如何更新自身?

我想用我正在開發的一個特定的非遊戲應用程序來移動這個方向。啓動器的概念非常有意義:它檢查更新,替換適當的二進制文件/庫,可能運行完整性檢查並啓動應用程序。但是,發射器如何更新自己?這往往是一個罕見的事件,但它是如何完成的?啓動程序是否真的只是寫了它正在運行的二進制文件?或者在下載之後是否有某種交換步驟?我需要能夠推出(罕見)更新到啓動程序(特別是如果我發現我的啓動器中的一些錯誤)。

我的特定項目將使用C#,但我對概念上相似的C++和/或Java解決方案感興趣,以備將來參考。

+1

一旦程序被加載到內存中,它不應該真正關心是否會發生從那裏來,所以你應該被允許覆蓋的二進制圖像文件。然後,你需要做的就是重新啓動程序,或許使用'exec'。 –

+0

@KerrekSB聽起來很簡單。儘管如此,我仍然對最後一步仍然有點模糊。那麼,在一個單獨的過程中運行該程序,然後退出? – TheBuzzSaw

+5

@KerrekSB,Windows在運行時鎖定可執行文件。部分原因是某些部分可能無法立即加載。 –

回答

5

我從來沒有嘗試過,但是這是我猜什麼(假設你不能覆蓋文件執行。如果可以的話,這是所有簡單)

Updater A checks if its the newest version 
If launcher isnt the newest version 
    Download the differences (to save bandwidth) to file B 
    Apply the delta to own code into file C 
    Launch file C. 
    Close 
If file C exists (update happened recently) 
    Try to delete C (update was previous launch, delete temporary file) 
    If delete fails (We are C, means A is out of date) 
     Copy C over A (update launcher) 
     Note that you can keep going, don't have to restart even though we are C. 
If game isnt newest version 
    Download the differences (to save bandwidth) to file B 
    Apply the delta to game into file D 
    delete game 
    Rename D -> game 
Run game 

André Caron指示我,交易技巧在transactional file IO下更好。

+0

這絕對給了我一些想法。我現在正在研究他們。 – TheBuzzSaw

+0

如果連接中斷? –

+1

@GaryVass:我認爲臨時文件照顧到了這一點。你在我的設計的某個地方看到缺陷嗎?所有下載到一個單獨的文件'B'直到完成,然後在執行之前應用到另一個文件'C' /'D'直到完成。 –

2

如果您在.NET世界中,有一種名爲「Click Once」的部署策略。這是爲了解決你所描述的問題...

ClickOnce是部署技術,允許你創建一個可安裝自行更新的基於Windows的應用程序和最少的用戶交互運行。 ClickOnce部署克服了部署固有三大問題:

來源:Click Once

在着手這一策略,因爲有狂熱的粉絲和批評者,我建議研究其利弊。

簡而言之,您可以將新版本上傳到網站(應用程序配置瞭解的信息)。在啓動時,應用程序會檢查網站,如果有更新,則會向用戶提供對話框。當用戶選擇應用更新時,應用程序停止,同時激活「點擊一次」組件以應用更改。該組件然後重新啓動該可執行文件,這一切都顯示爲一個無縫的操作,最終用戶...

+2

謝謝你分享這個。我會研究ClickOnce,但我仍然對看到直接的基於代碼的解決方案感興趣。我想從概念上理解這個過程,我是否需要自己編寫代碼。 – TheBuzzSaw

+1

我認爲OP正在尋找用於實現像那樣的系統的技術。這並不能解釋如何更新啓動程序。無論如何,你仍然需要更新「Click Once」啓動器。如果它自動更新,那麼也許你可以詳細說明這是如何實現的? –

+0

@AndréCaron,鏈接給出了關於啓動程序如何更新自身的非常清晰的解釋。我建議閱讀它,然後返回任何其餘的問題,你有 –

1

基本上發射檢查,看看是否有它自身的一個新版本,如果是這樣揭開序幕任務獲得新版本,然後執行它,然後關閉。

鑑於updater應用程序很小並且加載速度很快,您可以讓它檢測,下載,粘貼一個對話框來表示有新版本,並且在舊版本關閉並且新版本運行時幾乎不閃爍。

相關問題