可以配置 ClickOnce 应用程序,以便在具有较新文件版本和程序集版本的程序集可用时自动更新。 若要确保客户同意此行为,可以向他们显示隐私提示。 然后,他们可以选择是否向应用程序授予自动更新的权限。 如果不允许应用程序自动更新,则它不会安装。
注释
本文中的说明说明了 Visual Studio 中提供的交互式开发体验(IDE)的最新版本。 您的计算机可能会显示某些用户界面元素的不同名称或位置。 你可能使用的是不同版本的 Visual Studio 或不同的环境设置。 有关详细信息,请参阅个性化设置 IDE。
“创建更新许可”对话框
若要显示隐私提示,请创建一个应用程序,要求读者同意应用程序的自动更新。
创建同意对话框
在 “文件” 菜单上,指向 “新建” ,然后单击 “项目” 。
在“ 新建项目 ”对话框中,单击 “Windows”,然后单击“ WindowsFormsApplication”。
对于 “名称”,键入 ConsentDialog,然后单击“ 确定”。
在设计器中,单击窗体。
在 “属性” 窗口中,将 “文本 ”属性更改为 “更新许可对话框”。
在 工具箱中,展开 “所有 Windows 窗体”,然后将 “标签” 控件拖动到窗体。
在设计器中,单击标签控件。
在“属性”窗口中,将“外观”下的“文本”属性更改为以下内容:
要安装的应用程序将检查 Web 上的最新更新。 通过单击“我同意”,可以授权应用程序从 Internet 自动检查和安装更新。
在 工具箱中,将 复选框 控件拖到窗体中间。
在“属性”窗口中,将“布局”下的“文本”属性更改为“我同意”。
在 工具箱中,将 按钮 控件拖到窗体左下角。
在“属性”窗口中,将布局下的“文本”属性更改为“继续”。
在“属性”窗口中,将“设计”下的“名称”属性更改为“继续按钮”。
在 工具箱中,将 按钮 控件拖到窗体右下角。
在“属性”窗口中,将布局下的“文本”属性更改为“取消”。
在“属性”窗口中,将“设计”下的“名称”属性更改为 CancelButton。
在设计器中,双击 “我同意 ”复选框以生成 CheckedChanged 事件处理程序。
在 Form1 代码文件中,为 CheckedChanged 事件处理程序添加以下代码。
更新类构造函数以默认禁用 “继续 ”按钮。
在 Form1 代码文件中,为布尔变量添加以下代码,以跟踪最终用户是否同意联机更新。
在设计器中,双击 “继续 ”按钮以生成 Click 事件处理程序。
在 Form1 代码文件中,将以下代码添加到“ 继续 ”按钮的 Click 事件处理程序。
在设计器中,双击“ 取消 ”按钮以生成 Click 事件处理程序。
在 Form1 代码文件中,为“ 取消” 按钮的 Click 事件处理程序添加以下代码。
如果最终用户不同意联机更新,则更新应用程序以返回错误。
仅适用于 Visual Basic 开发人员:
在 解决方案资源管理器中,单击 ConsentDialog。
在 “项目 ”菜单上,单击“ 添加模块”,然后单击“ 添加”。
在 Module1.vb 代码文件中,添加以下代码。
Module Module1 Function Main() As Integer Application.EnableVisualStyles() Application.SetCompatibleTextRenderingDefault(False) Dim f As New Form1() Application.Run(f) If (Not f.accepted) Then Return -1 Else Return 0 End If End Function End Module在 “项目 ”菜单上,单击 “ConsentDialog 属性”,然后单击“ 应用程序 ”选项卡。
取消选中 “启用应用程序框架”。
在 “启动对象 ”下拉菜单中,选择 “Module1”。
注释
禁用应用程序框架会禁用视觉样式、应用程序事件、初始屏幕、单实例应用程序等功能。 有关详细信息,请参阅应用程序页、项目设计器(Visual Basic)。
仅适用于 Visual C# 开发人员:
打开 Program.cs 代码文件,并添加以下代码。
static int Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 f = new Form1(); Application.Run(f); if (!f.accepted) return -1; else return 0; }
在 “生成 ”菜单上,单击“ BuildSolution”。
创建自定义引导程序包
若要向最终用户显示隐私提示,可以为更新许可对话框应用程序创建自定义引导程序包,并将其作为先决条件包含在所有 ClickOnce 应用程序中。
此过程演示如何通过创建以下文档创建自定义引导程序包:
用于描述引导程序内容的 product.xml 清单文件。
package.xml 清单文件,用于列出包的本地化特定方面,例如字符串和软件许可条款。
一份关于软件许可条款的文档。
步骤 1:创建启动器目录
在 %PROGRAMFILES%\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages 中创建名为 UpdateConsentDialog 的目录。
注释
可能需要管理权限才能创建此文件夹。
在 UpdateConsentDialog 目录中,创建名为 en 的子目录。
注释
为每个语言环境创建新目录。 例如,可以为法语 (fr) 和德语 (de) 区域设置添加子目录。 如有必要,这些目录将包含法语和德语字符串和语言包。
步骤 2:创建 product.xml 清单文件
创建名为 product.xml的文本文件。
在 product.xml 文件中,添加以下 XML 代码。 请确保不要覆盖已有的 XML 代码。
<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" ProductCode="Microsoft.Sample.EULA"> <!-- Defines the list of files to be copied on build. --> <PackageFiles CopyAllPackageFiles="false"> <PackageFile Name="ConsentDialog.exe"/> </PackageFiles> <!-- Defines how to run the Setup package.--> <Commands > <Command PackageFile = "ConsentDialog.exe" Arguments=''> <ExitCodes> <ExitCode Value="0" Result="Success" /> <ExitCode Value="-1" Result="Fail" String="AU_Unaccepted" /> <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" /> </ExitCodes> </Command> </Commands> </Product>将文件保存到 UpdateConsentDialog 引导程序目录。
步骤 3:创建 package.xml 清单文件和软件许可条款
创建名为 package.xml的文本文件。
在 package.xml 文件中,添加以下 XML 代码以定义区域设置并包括软件许可条款。 确保不会覆盖现有的 XML 代码。
<Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" Name="DisplayName" Culture="Culture" LicenseAgreement="eula.rtf"> <PackageFiles> <PackageFile Name="eula.rtf"/> </PackageFiles> <!-- Defines a localizable string table for error messages. --> <Strings> <String Name="DisplayName">Update Consent Dialog</String> <String Name="Culture">en</String> <String Name="AU_Unaccepted">The automatic update agreement is not accepted.</String> <String Name="GeneralFailure">A failure occurred attempting to launch the setup.</String> </Strings> </Package>将文件保存到 UpdateConsentDialog 引导程序目录中的 en 子目录。
为软件许可条款创建名为 “eula.rtf ”的文档。
注释
软件许可条款应包括有关许可、担保、责任和当地法律的信息。 这些文件应特定于区域设置,因此请确保该文件以支持 MBCS 或 UNICODE 字符的格式保存。 咨询法律部门,了解软件许可条款的内容。
将文档保存到 UpdateConsentDialog 引导程序目录中的 en 子目录。
如有必要,请为每个区域设置的软件许可条款创建一个新的 package.xml 清单文件和一个新的 eula.rtf 文档。 例如,如果为 fr 和 de 区域设置创建了子目录,请创建单独的 package.xml 清单文件和软件许可条款,并将其保存到 fr 和 de 子目录。
将更新许可应用程序设置为先决条件
在 Visual Studio 中,可以将更新许可应用程序设置为先决条件。
将更新许可应用程序设置为先决条件
在 解决方案资源管理器中,单击要部署的应用程序的名称。
在 “项目 ”菜单上,单击“ ProjectName属性”。
单击“ 发布 ”页,然后单击“ 先决条件”。
选择“ 更新许可”对话框。
注释
可能需要关闭并重新打开 Visual Studio 才能在“先决条件”对话框中查看“更新许可”对话框。
单击 “确定” 。
创建并测试安装程序
将更新许可应用程序设置为先决条件后,可以为应用程序生成安装程序和引导程序。
若要创建和测试安装程序,请不要单击“我同意”
在 解决方案资源管理器中,单击要部署的应用程序的名称。
在 “项目 ”菜单上,单击“ ProjectName属性”。
单击“ 发布 ”页,然后单击“ 立即发布”。
如果发布输出未自动打开,请导航到发布输出。
运行 Setup.exe 程序。
安装程序显示“更新许可对话框”软件许可协议。
阅读软件许可协议,然后单击“ 接受”。
此时会显示“更新许可对话框”应用程序,并显示以下文本:要安装的应用程序将检查 Web 上的最新更新。 通过单击“我同意”,可以授权应用程序在 Internet 上自动检查更新。
关闭应用程序或单击“取消”。
应用程序显示错误:安装 ApplicationName 的系统组件时出错。 在成功安装完所有系统组件之前,安装程序无法继续。
单击“详细信息”以显示以下错误消息:组件更新同意对话框安装失败,并显示以下错误消息:“不接受自动更新协议。以下组件无法安装: - 更新许可对话框
单击 “关闭” 。
通过单击“我同意”来创建和测试安装程序
在 解决方案资源管理器中,单击要部署的应用程序的名称。
在 “项目 ”菜单上,单击“ ProjectName属性”。
单击“ 发布 ”页,然后单击“ 立即发布”。
如果发布输出未自动打开,请导航到发布输出。
运行 Setup.exe 程序。
安装程序显示“更新许可对话框”软件许可协议。
阅读软件许可协议,然后单击“ 接受”。
此时会显示“更新许可对话框”应用程序,并显示以下文本:要安装的应用程序将检查 Web 上的最新更新。 通过单击“我同意”,可以授权应用程序在 Internet 上自动检查更新。
单击 “我同意”,然后单击“ 继续”。
应用程序开始安装。
如果出现“应用程序安装”对话框,请单击“ 安装”。