在Windows上,當至少一個應用程序的運行被鎖定自己的.exe文件和所有靜態鏈接的.dll文件。這可以防止應用程序直接更新自己,如果它希望阻止重新啓動(如果重新啓動可以,應用程序可以將MOVEFILE_DELAY_UNTIL_REBOOT
標誌傳遞給MoveFileEx並可自由'覆蓋'它自己的.exe,如無論如何都會延遲)。這就是爲什麼通常應用程序不會檢查自己的.exe更新,但他們啓動一個墊片,檢查更新,然後啓動「真正的」應用程序。事實上,'shim'甚至可以由操作系統本身完成,憑藉一個正確配置的清單文件。 Visual Studio構建的應用程序將其作爲預製嚮導打包工具,請參閱ClickOnce Deployment for Visual C++ Applications。
典型的Linux應用程序並沒有自行更新,因爲許多OS的許多風格。大多數應用程序是作爲源代碼分發的,可以通過某些版本的自動地獄來自行配置和構建自己,然後通過make install
進行安裝(所有這些都可以在包後自動執行)。即使是作爲Linux的特定版本的二進制文件分發的應用程序也不會自己複製,而是並排安裝新版本,然後更新symbolic link
以「激活」新版本(同樣,軟件包管理軟件可能會隱藏這個)。
如果OS X應用程序屬於Posix風格,或者屬於爲您處理更新的Mac AppStore應用程序存儲區,則OS X應用程序可能屬於Linux存儲桶。
我會推動自己的自我更新永遠不會達到這些技術(ClickOnce,RPMs,AppStore)的複雜性,併爲用戶提供發現,升級和卸載的預期行爲。我會順應潮流,在各自的平臺中使用這些技術。
據我所知,在程序運行時,Windows不會讓你覆蓋EXE。這是Windows中最令人討厭的事情之一,imo。 – unwind 2012-02-06 16:01:08
正如我在另一個問題上告訴你的,你無法覆蓋正在運行的exe文件。我甚至一步一步地指導如何完成整個過程。 – 2012-02-06 16:27:38
@MooingDuck我知道!我仍然將您的答案作爲高級設計參考。我只是縮小了這個問題的範圍。我已經很滿意答案了。 – TheBuzzSaw 2012-02-06 17:29:29