選擇 ClickOnce 更新策略

ClickOnce 可提供自動應用程式更新。 ClickOnce 應用程式會定期讀取它的部署資訊清單檔,以查看是否有此應用程式的更新可用。 如果有,就會下載及執行應用程式的新版本。 為了提高效率,只有已變更的檔案才會下載。

設計 ClickOnce 應用程式時,您必須決定應用程式要使用哪一種策略來查看可用的更新。 您有三種基本的策略可以使用:在應用程式啟動時檢查更新、在應用程式啟動後檢查更新 (在背景執行緒中執行),或提供更新的使用者介面。

此外,您可以決定應用程式檢查更新的頻率,而且可以讓更新成為必要。

注意

應用程式更新會需要網路連接。 如果沒有網路連接,不論您所選擇的更新策略為何,應用程式將會執行但不檢查更新。

注意

在 .NET Framework 2.0 和 .NET Framework 3.0 中,不論應用程式是隨時檢查更新、在啟動之前或之後檢查更新,或者使用 <xref:System.Deployment.Application> API 檢查更新,您都必須在部署資訊清單中設定 deploymentProviderdeploymentProvider 元素相當於 Visual Studio 中,[發行] 索引標籤之 [更新] 對話方塊中的 [更新位置] 欄位。 .NET Framework 3.5 則放寬了此規則。 如需詳細資訊,請參閱針對測試和實際執行伺服器部署 ClickOnce 應用程式但不重新簽章

在應用程式啟動後檢查更新

使用此策略時,應用程式會在執行中時,嘗試在背景中尋找及讀取部署資訊清單檔。 如果有可用的更新,下次使用者執行應用程式時,就會收到下載並安裝更新的提示。

這項策略最適合低頻寬網路連接或可能需要冗長下載時間的大型應用程式。

若要啟用此更新策略,請在 [應用程式更新] 對話方塊的 [選擇應用程式應該於何時檢查更新檔] 區段中,按一下 [應用程式啟動之後]。 接著在 [指定應用程式應該要檢查更新檔的頻率] 區段內指定更新間隔。

這個步驟與在部署資訊清單內變更 [Update] 元素相同,如下所示:

<!-- When to check for updates -->
<subscription>
   <update>
      <expiration maximumAge="6" unit="hours" />
   </update>
</subscription>

在應用程式啟動前檢查更新

預設的策略是在應用程式啟動前,嘗試找出並讀取部署資訊清單檔。 使用此策略時,每次使用者啟動應用程式,應用程式就會嘗試找出並讀取部署資訊清單檔。 如果更新無法使用,將會啟動現有的應用程式版本。 如果有必要的更新可用,則會予以下載並啟動。 如果有可用但非必要的更新,則使用者可選擇升級或啟動現有的版本。

這項策略最適合高頻寬網路連接,因為在低頻寬連接上啟動應用程式的延遲時間可能會非常久。

若要啟用此更新策略,請在 [應用程式更新] 對話方塊的 [選擇應用程式應該於何時檢查更新] 區段中,按一下 [在應用程式啟動前]

這個步驟與在部署資訊清單內變更 [Update] 元素相同,如下所示:

<!-- When to check for updates -->
<subscription>
   <update>
      <beforeApplicationStartup />
   </update>
</subscription>

注意

針對 .NET Core 3.1 和 .NET 5 和更新版的應用程式,在應用程式啟動之前檢查更新是唯一支援的更新選項。

進行必要的更新

有時候,您可能會想要要求使用者執行更新版本的應用程式。 例如,您可能會對外部資源 (例如 Web 服務) 進行變更,進而導致舊版應用程式無法正確運作。 在這種情況下,您就會想要將更新標記為必要,並防止使用者執行舊版。

注意

雖然您可以使用其他更新策略來要求更新,不過選取 [在應用程式啟動前] 選項是保證不會執行舊版的唯一方式。 在啟動時若偵測到強制更新,使用者就必須接受更新或關閉應用程式。

若要將更新標記為必要項,請在 [應用程式更新] 對話方塊中按一下 [指定此應用程式的最小必要版本],然後指定發行版本 (主要次要建置修訂),這樣會指定可安裝應用程式的最低版本號碼。

這項設定與在部署資訊清單中設定 [Deployment] 元素的 minimumRequiredVersion 屬性相同,例如:

<deployment install="true" minimumRequiredVersion="1.0.0.0">

指定更新間隔

您也可以指定應用程式檢查更新的頻率。 若要這樣做,請根據本主題前面「在應用程式啟動後檢查更新」一節所述的方式,將應用程式指定為在啟動後檢查更新。

若要指定更新間隔,請在 [應用程式更新] 對話方塊中設定指定應用程式應該要檢查更新檔的頻率屬性。

這項設定與在部署資訊清單中設定 [Update] 元素的 maximumAgeunit 屬性相同。

例如,您可能會想要在應用程式每次執行時檢查、每週檢查一次,或每月檢查一次。 如果在指定的時間沒有網路連接,就會在應用程式下次執行時執行更新檢查。

注意

在適用於 .NET Core 和 .NET 5 或更新版本的 ClickOnce 中,不支援此功能。 如需詳細資訊,請參閱適用於 .NET 的 ClickOnce

提供更新的使用者介面

使用這項策略時,應用程式開發人員就會提供一個使用者介面,以便讓使用者選擇應用程式檢查更新的時間以及頻率。 例如,您可能會提供 [立即檢查更新檔] 命令,或是有不同更新間隔選項的 [更新設定] 對話方塊。 ClickOnce 部署 API 提供了讓您以程式設計方式自行設計更新使用者介面的架構。 如需詳細資訊,請參閱 System.Deployment.Application

注意

.NET Core 和 .NET 5 和更新版本中不支援 System.Deployment.Application 命名空間中的 ApplicationDeployment 類別和 API。 .NET 7 支援存取應用程式部署屬性的新方法。 如需詳細資訊,請參閱在 .NET 中存取 ClickOnce 部署屬性。 .NET 7 不支援 ApplicationDeployment 方法的同等項。

如果應用程式是使用部署 API 來控制它本身的更新邏輯,您應該要封鎖更新檢查,如下一節「封鎖更新檢查」所述。

這項策略最適合在您需要針對不同使用者使用不同的更新策略時。

封鎖更新檢查

您也可以防止應用程式檢查更新。 例如,您可能有一個永遠不會更新的簡單應用程式,但想要利用 ClickOnce 部署所提供的簡易安裝功能。

如果應用程式是使用部署 API 來執行它本身的更新,您也應該要封鎖更新檢查;請參閱本主題前面的「提供更新的使用者介面」。

若要禁止更新檢查,請取消選取 [應用程式更新] 對話方塊中的 [應用程式應該檢查更新] 核取方塊。

此外,您也可以從部署資訊清單中移除 <Subscription> 標記,藉以封鎖更新檢查。

權限提高和更新

如果 ClickOnce 應用程式的新版本需要使用比舊版本更高的信任層級才能執行,則 ClickOnce 將會提示使用者,詢問使用者是否要對應用程式授與這個較高的信任層級。 如果使用者拒絕授與較高的信任層級,則不會安裝更新。 ClickOnce 將會在下一次重新啟動時,再次提示使用者安裝此應用程式。 如果使用者在這時拒絕授與較高的信任層級,而且此更新未標記為必要項,則會執行舊版的應用程式。 不過,如果此更新為必要項,則使用者必須接受較高的信任層級之後,才會執行此應用程式。

如果您使用受信任的應用程式部署,就不會出現授與信任層級的提示。 如需詳細資訊,請參閱信任的應用程式部署概觀