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

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

注意

本文中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 你可能正在使用其他版本的 Visual Studio 或其他环境设置。 有关详细信息,请参阅个性化设置 IDE

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

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

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

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

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

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

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

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

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

    要安装的应用程序会在 Web 上检查最新更新。 单击“我同意”即可授权应用程序自动从 Internet 检查和安装更新。

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

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

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

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

  13. 在“属性”窗口中,将“设计”下的“(名称)”属性更改为“ProceedButton”。

  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” 。

      注意

      禁用应用程序框架时,将禁用一些功能,例如视觉对象样式、应用程序事件、初始屏幕、单实例应用程序等。 有关详细信息,请参阅 Application Page, Project Designer (Visual Basic)(应用程序页、项目设计器 (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. 如果显示“应用程序安装”对话框,请单击“安装”。