ClickOnce 可以提供自动应用程序更新。 ClickOnce 应用程序会定期读取其部署清单文件,以查看应用程序的更新是否可用。 如果可用,则会下载并运行应用程序的新版本。 为了提高效率,仅下载已更改的文件。
设计 ClickOnce 应用程序时,必须确定应用程序将用于检查可用更新的策略。 可以使用三种基本策略:在应用程序启动时检查更新、在应用程序启动后检查更新(在后台线程中运行),或提供更新的用户界面。
此外,您可以确定应用程序多长时间检查一次更新,并且可以将更新设置为必需。
注释
应用程序更新需要网络连接。 如果没有网络连接,应用程序将在不检查更新的情况下运行,而不管选择了什么更新策略。
注释
在 .NET Framework 2.0 和 .NET Framework 3.0 中,每当应用程序在启动之前或之后检查更新,或使用 <xref:System.Deployment.Application> API,都必须在部署清单中设置 deploymentProvider 。 Visual Studio 中的deploymentProvider元素对应于“更新”对话框的“更新位置”字段,位于“发布”选项卡中。.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 和单位属性相同。
例如,可能需要检查应用程序每次运行时,或每周一次,或每月一次。 如果指定时间不存在网络连接,则下次运行应用程序时将执行更新检查。
注释
在 ClickOnce for .NET Core 和 .NET 5 或更高版本中,此功能不受支持。 有关详细信息,请参阅 ClickOnce for .NET。
提供用于更新的用户界面
使用此策略时,应用程序开发人员提供了一个用户界面,使用户能够选择应用程序检查更新的时间或频率。 例如,可以提供“立即检查更新”命令,或提供“更新设置”对话框,其中包含不同更新间隔的选项。 ClickOnce 部署 API 提供了一个框架来编程你自己的更新用户界面。 有关详细信息,请参阅 System.Deployment.Application 命名空间。
注释
ApplicationDeployment 类和System.Deployment.Application 命名空间中的 API 在 .NET Core 和 .NET 5 及更高版本中不受支持。 在 .NET 7 中,支持访问应用程序部署属性的新方法。 有关详细信息,请参阅 .NET 中的 Access ClickOnce 部署属性。 .NET 7 不支持 ApplicationDeployment 方法的等效项。
如果应用程序使用部署 API 控制其自己的更新逻辑,则应阻止更新检查,如以下部分中的“阻止更新检查”中所述。
当你需要不同用户的不同更新策略时,此策略最有效。
阻止更新检查
还可以彻底阻止应用程序检查更新。 例如,你可能有一个简单的应用程序,永远不会更新,但你想要利用 ClickOnce 部署提供的轻松安装。
如果您的应用程序使用部署 API 执行自己的更新,则应阻止更新检查。有关详细信息,请参阅本主题前面的“提供更新的用户界面”。
若要阻止更新检查,请清除 “应用程序更新”对话框中的“应用程序应检查更新 ”复选框。
还可以通过从部署清单中删除 <Subscription> 标记来阻止更新检查。
权限提升和更新
如果 ClickOnce 应用程序的新版本需要比以前的版本更高的信任级别才能运行,ClickOnce 会提示用户,询问他们是否希望向应用程序授予此更高级别的信任。 如果用户拒绝授予更高的信任级别,则不会安装更新。 ClickOnce 将在下次重启时提示用户再次安装该应用程序。 如果用户此时拒绝授予更高级别的信任,并且更新未标记为必需,则会运行旧版应用程序。 但是,如果需要更新,则在用户接受更高的信任级别之前,应用程序不会再次运行。
如果使用受信任的应用程序部署,则不会提示提供信任级别。 有关详细信息,请参阅 受信任的应用程序部署概述。