演练:创建带有隐私提示的自定义引导程序

可以配置 ClickOnce 应用程序,以便在具有较新文件版本和程序集版本的程序集可用时自动更新。 若要确保客户同意此行为,可以向他们显示隐私提示。 然后,他们可以选择是否向应用程序授予自动更新的权限。 如果不允许应用程序自动更新,则它不会安装。

注释

本文中的说明说明了 Visual Studio 中提供的交互式开发体验(IDE)的最新版本。 您的计算机可能会显示某些用户界面元素的不同名称或位置。 你可能使用的是不同版本的 Visual Studio 或不同的环境设置。 有关详细信息,请参阅个性化设置 IDE

若要显示隐私提示,请创建一个应用程序,要求读者同意应用程序的自动更新。

  1. “文件” 菜单上,指向 “新建” ,然后单击 “项目”

  2. 在“ 新建项目 ”对话框中,单击 “Windows”,然后单击“ WindowsFormsApplication”。

  3. 对于 “名称”,键入 ConsentDialog,然后单击“ 确定”。

  4. 在设计器中,单击窗体。

  5. “属性” 窗口中,将 “文本 ”属性更改为 “更新许可对话框”。

  6. 工具箱中,展开 “所有 Windows 窗体”,然后将 “标签” 控件拖动到窗体。

  7. 在设计器中,单击标签控件。

  8. “属性”窗口中,将“外观”下的“文本”属性更改为以下内容:

    要安装的应用程序将检查 Web 上的最新更新。 通过单击“我同意”,可以授权应用程序从 Internet 自动检查和安装更新。

  9. 工具箱中,将 复选框 控件拖到窗体中间。

  10. “属性”窗口中,将“布局”下的“文本”属性更改为“我同意”。

  11. 工具箱中,将 按钮 控件拖到窗体左下角。

  12. “属性”窗口中,将布局下的“文本”属性更改为“继续”。

  13. “属性”窗口中,将“设计”下的“名称”属性更改为“继续按钮”。

  14. 工具箱中,将 按钮 控件拖到窗体右下角。

  15. “属性”窗口中,将布局下的“文本”属性更改为“取消”。

  16. “属性”窗口中,将“设计”下的“名称”属性更改为 CancelButton

  17. 在设计器中,双击 “我同意 ”复选框以生成 CheckedChanged 事件处理程序。

  18. 在 Form1 代码文件中,为 CheckedChanged 事件处理程序添加以下代码。

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        ProceedButton.Enabled = !ProceedButton.Enabled;
    }
    
  19. 更新类构造函数以默认禁用 “继续 ”按钮。

    public Form1()
    {
        InitializeComponent();
        ProceedButton.Enabled = false;
    }
    
  20. 在 Form1 代码文件中,为布尔变量添加以下代码,以跟踪最终用户是否同意联机更新。

    public bool accepted = false;
    
  21. 在设计器中,双击 “继续 ”按钮以生成 Click 事件处理程序。

  22. 在 Form1 代码文件中,将以下代码添加到“ 继续 ”按钮的 Click 事件处理程序。

    private void ProceedButton_Click(object sender, EventArgs e)
    {
        if (ProceedButton.Enabled)
        {
            accepted = true;
            this.Close();
        }
    }
    
  23. 在设计器中,双击“ 取消 ”按钮以生成 Click 事件处理程序。

  24. 在 Form1 代码文件中,为“ 取消” 按钮的 Click 事件处理程序添加以下代码。

    private void CancelButton_Click(object sender, EventArgs e)
    {
        this.Close();
    }
    
  25. 如果最终用户不同意联机更新,则更新应用程序以返回错误。

    仅适用于 Visual Basic 开发人员:

    1. 解决方案资源管理器中,单击 ConsentDialog

    2. “项目 ”菜单上,单击“ 添加模块”,然后单击“ 添加”。

    3. 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
      
    4. “项目 ”菜单上,单击 “ConsentDialog 属性”,然后单击“ 应用程序 ”选项卡。

    5. 取消选中 “启用应用程序框架”。

    6. “启动对象 ”下拉菜单中,选择 “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;
      }
      
  26. “生成 ”菜单上,单击“ BuildSolution”。

创建自定义引导程序包

若要向最终用户显示隐私提示,可以为更新许可对话框应用程序创建自定义引导程序包,并将其作为先决条件包含在所有 ClickOnce 应用程序中。

此过程演示如何通过创建以下文档创建自定义引导程序包:

  • 用于描述引导程序内容的 product.xml 清单文件。

  • package.xml 清单文件,用于列出包的本地化特定方面,例如字符串和软件许可条款。

  • 一份关于软件许可条款的文档。

步骤 1:创建启动器目录

  1. %PROGRAMFILES%\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages 中创建名为 UpdateConsentDialog 的目录。

    注释

    可能需要管理权限才能创建此文件夹。

  2. UpdateConsentDialog 目录中,创建名为 en 的子目录。

    注释

    为每个语言环境创建新目录。 例如,可以为法语 (fr) 和德语 (de) 区域设置添加子目录。 如有必要,这些目录将包含法语和德语字符串和语言包。

步骤 2:创建 product.xml 清单文件

  1. 创建名为 product.xml的文本文件。

  2. 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>
    
  3. 将文件保存到 UpdateConsentDialog 引导程序目录。

步骤 3:创建 package.xml 清单文件和软件许可条款

  1. 创建名为 package.xml的文本文件。

  2. 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>
    
  3. 将文件保存到 UpdateConsentDialog 引导程序目录中的 en 子目录。

  4. 为软件许可条款创建名为 “eula.rtf ”的文档。

    注释

    软件许可条款应包括有关许可、担保、责任和当地法律的信息。 这些文件应特定于区域设置,因此请确保该文件以支持 MBCS 或 UNICODE 字符的格式保存。 咨询法律部门,了解软件许可条款的内容。

  5. 将文档保存到 UpdateConsentDialog 引导程序目录中的 en 子目录。

  6. 如有必要,请为每个区域设置的软件许可条款创建一个新的 package.xml 清单文件和一个新的 eula.rtf 文档。 例如,如果为 fr 和 de 区域设置创建了子目录,请创建单独的 package.xml 清单文件和软件许可条款,并将其保存到 fr 和 de 子目录。

在 Visual Studio 中,可以将更新许可应用程序设置为先决条件。

  1. 解决方案资源管理器中,单击要部署的应用程序的名称。

  2. “项目 ”菜单上,单击“ ProjectName属性”。

  3. 单击“ 发布 ”页,然后单击“ 先决条件”。

  4. 选择“ 更新许可”对话框

    注释

    可能需要关闭并重新打开 Visual Studio 才能在“先决条件”对话框中查看“更新许可”对话框。

  5. 单击 “确定”

创建并测试安装程序

将更新许可应用程序设置为先决条件后,可以为应用程序生成安装程序和引导程序。

若要创建和测试安装程序,请不要单击“我同意”

  1. 解决方案资源管理器中,单击要部署的应用程序的名称。

  2. “项目 ”菜单上,单击“ ProjectName属性”。

  3. 单击“ 发布 ”页,然后单击“ 立即发布”。

  4. 如果发布输出未自动打开,请导航到发布输出。

  5. 运行 Setup.exe 程序。

    安装程序显示“更新许可对话框”软件许可协议。

  6. 阅读软件许可协议,然后单击“ 接受”。

    此时会显示“更新许可对话框”应用程序,并显示以下文本:要安装的应用程序将检查 Web 上的最新更新。 通过单击“我同意”,可以授权应用程序在 Internet 上自动检查更新。

  7. 关闭应用程序或单击“取消”。

    应用程序显示错误:安装 ApplicationName 的系统组件时出错。 在成功安装完所有系统组件之前,安装程序无法继续。

  8. 单击“详细信息”以显示以下错误消息:组件更新同意对话框安装失败,并显示以下错误消息:“不接受自动更新协议。以下组件无法安装: - 更新许可对话框

  9. 单击 “关闭”

通过单击“我同意”来创建和测试安装程序

  1. 解决方案资源管理器中,单击要部署的应用程序的名称。

  2. “项目 ”菜单上,单击“ ProjectName属性”。

  3. 单击“ 发布 ”页,然后单击“ 立即发布”。

  4. 如果发布输出未自动打开,请导航到发布输出。

  5. 运行 Setup.exe 程序。

    安装程序显示“更新许可对话框”软件许可协议。

  6. 阅读软件许可协议,然后单击“ 接受”。

    此时会显示“更新许可对话框”应用程序,并显示以下文本:要安装的应用程序将检查 Web 上的最新更新。 通过单击“我同意”,可以授权应用程序在 Internet 上自动检查更新。

  7. 单击 “我同意”,然后单击“ 继续”。

    应用程序开始安装。

  8. 如果出现“应用程序安装”对话框,请单击“ 安装”。