选择 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”元素的“maximumAge”和“unit”属性的效果相同

例如,您可能希望在应用程序每次运行时都进行检查,或是一周检查一次,或一个月检查一次。 如果在指定时间不存在网络连接,则更新检查会在应用程序下一次运行时执行。

注意

在适用于 .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 会再次提示用户安装该应用程序。 如果用户此时拒绝授予较高的信任级别,并且更新并未标记为“必需”,则该应用程序的早期版本将会运行。 但是,如果更新是“必需”的,则在用户接受较高的信任级别之前,该应用程序不会再次运行。

如果使用受信任的应用程序部署,则不会出现任何信任级别提示。 有关详细信息,请参阅受信任的应用程序部署概述