2017-01-23 110 views
7

我們有一個.Net應用程序,它使用ClickOnce來自動更新。但Click Once的問題在於,無論項目中是否發生任何變化,所有程序集都會得到更新。我在想手動更新只有更改dll到以前的ClickOnce發佈文件夾和更新清單使用MageUI.exe。我也想到增量更改組件版本,以便我們可以通過查看安裝ClickOnce應用程序的用戶的緩存文件夾來跟蹤哪些程序集已更改。我想知道這是一個可接受的的方法嗎?謝謝。在ClickOnce中維護程序集版本?

+0

聽起來像是等待發生的問題,如果你問我。如果一位客戶錯過了特定的「中間」更新,該怎麼辦?他會得到一個新版本,但是可能不包含前一版本中引入的一些他沒有得到的更改。 – user1429080

+0

所以,點擊一次安裝後,我們將檢查驗證所有dll的版本號。因此,如果更新1有一個版本爲#1.1.1.1的dll,並且更新2有另一個版本爲1.1.1.2的dll,則更新3單擊一次安裝應該具有版本1.1.1.1的dll 1和版本1.1.1.2的dll 2與更新3中引入的更改。實際上,最新的點擊一次發佈將被更新以使用mage ui添加增量dll,並且所有客戶端將獲得相同的發佈,因此,如果客戶端在較舊版本中,他也會得到更新到最新。 –

+0

但這並不意味着每個版本都必須包含所有以前的版本+當前版本的更改?意思是,每個發行版都會變得更加「胖」,直到下一個發行版需要包含所有內容爲止。無論如何,據我所知,支持從任何舊版本升級到當前版本的唯一方法是在每個版本中包含所有內容。如果你有一組用戶,並且能夠控制它們定期更新,那麼也許這可以起作用... – user1429080

回答

4

我認爲這不是必需的。同時通過的ClickOnce提供的更新對話框不會這麼告訴你,當滿足以下條件的ClickOnce將無法下載文件:

  • 該文件的哈希值是相同的
  • 該文件的時間戳是相同的。
  • 對於組件,它可能需要強命名他們

相反,它會在文件從先前版本複製。

因此,如果您使用強名稱並且在沒有更改時不重建程序集,則ClickOnce應該按照您希望的方式執行。

參見herehere以供參考。

Here是官方消息說

當更新應用程序,除非該文件已更改的ClickOnce不下載的所有文件,爲應用程序的新版本。相反,它會將當前應用程序的應用程序清單中指定的文件的哈希簽名與新版本的清單中的簽名進行比較。如果文件簽名不同,ClickOnce會下載新版本。如果簽名匹配,則文件從一個版本到下一個版本沒有更改。在這種情況下,ClickOnce將複製現有文件並在新版本的應用程序中使用它。這種方法可以防止ClickOnce再次下載整個應用程序,即使只有一個或兩個文件發生了變化。

+0

是的,這是真的,但是當解決方案被構建時,所有程序集的清單更改無論有沒有代碼更改或沒有。 –

+0

是的,你是對的。您必須將項目放入不同的解決方案中,並手動更新「主」項目中的引用程序集。我同意這比把它們都放在一個解決方案中要方便得多。但是仍然是IMO,它比嘗試強制ClickOnce在哈希簽名更改時執行部分更新要好得多。 – wkl

+0

對於我們的應用程序,我們必須在部分dll更新的項目設置中設置標誌完全信任的應用程序,而不僅僅是強烈命名 – VMAtm