调试使用 System.Deployment.Application 的 ClickOnce 应用程序

在 Visual Studio 中,ClickOnce 部署允许配置应用程序的更新方式。 但是,如果要使用和自定义高级 ClickOnce 部署功能,则需要访问提供的 System.Deployment.Application部署对象模型。 可以将 System.Deployment.Application API 用于高级任务,例如:

  • 在应用程序中创建“立即更新”选项

  • 根据条件按需下载各种应用程序组件

  • 直接集成到应用程序中的更新

  • 保证客户端应用程序始终保持最新

    System.Deployment.Application由于 API 仅在使用 ClickOnce 技术部署应用程序时才起作用,因此调试这些 API 的唯一方法是使用 ClickOnce 部署应用程序,附加到该应用程序,然后对其进行调试。 可能很难提前附加调试器,因为此代码通常在应用程序启动和执行时运行,然后才能附加调试器。 解决方案是在更新检查代码或按需代码之前对 Visual Basic 项目放置中断(或停止)。

    建议的调试技术如下所示:

注释

ApplicationDeployment 类和System.Deployment.Application 命名空间中的 API 在 .NET Core 和 .NET 5 及更高版本中不受支持。 在 .NET 7 中,支持访问应用程序部署属性的新方法。 有关详细信息,请参阅 .NET 中的 Access ClickOnce 部署属性。 .NET 7 不支持 ApplicationDeployment 方法的等效项。

  1. 在开始之前,请确保符号文件(.pdb)和源文件已存档。

  2. 部署应用程序版本 1。

  3. 创建一个新的空白解决方案。 在“ 文件 ”菜单中,选择“ 新建”,然后选择 “项目”。 在“ 新建项目 ”对话框中,打开 “其他项目类型 ”节点,然后选择 Visual Studio Solutions 文件夹。 在 “模板 ”窗格中,选择 “空白解决方案”。

  4. 将存档的源位置添加到此新解决方案的属性。 在 解决方案资源管理器中,右键单击解决方案节点,然后选择 “属性”。 在“ 属性页 ”对话框中,选择 “调试源文件”,然后添加存档源代码的目录。 否则,调试器会查找过时的源文件,因为源文件路径记录在 .pdb 文件中。 如果调试器使用过时的源文件,则会看到一条消息,告知源不匹配。

  5. 确保调试器可以找到 .pdb 文件。 如果使用应用程序部署了文件,调试器会自动找到这些文件。 它始终首先出现在有问题的程序集旁边。 否则,需要将存档路径添加到符号文件位置列表。

    打开 “工具 ”(或 “调试” >选项 )窗格,然后展开“ 所有设置>调试>符号>搜索位置 ”部分。 在 符号文件 (.pdb) 位置 列表中添加、更改顺序或删除项。

    打开 “工具 ”(或 “调试” >选项 )对话框,然后展开 “调试>符号 ”部分。 在 符号文件 (.pdb) 搜索位置 列表中添加、更改顺序或删除项。

  6. 调试在CheckForUpdate方法调用和Download/Update方法调用之间发生的情况。

    例如,更新代码可能如下所示:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If My.Application.Deployment.IsNetworkDeployed Then
    
                If (My.Application.Deployment.CheckForUpdate()) Then
    
                    My.Application.Deployment.Update()
                    Application.Restart()
    
                End If
    
            End If
        End Sub
    
  7. 部署软件版本 2。

  8. 尝试在下载版本 2 的更新时将调试器附加到版本 1 应用程序。 或者,可以使用该方法 System.Diagnostics.Debugger.Break ,也可以直接 Stop 在 Visual Basic 中使用。 当然,不应将这些方法调用保留在生产代码中。

    例如,假设你正在开发 Windows 窗体应用程序,并且你具有此方法的事件处理程序,其中包含更新逻辑。 若要调试此问题,只需在按下按钮之前附加,然后设置断点(请确保打开相应的存档文件并在那里设置断点)。

    IsNetworkDeployed仅当部署应用程序时,才使用属性调用 System.Deployment.Application API;在 Visual Studio 中调试期间不应调用 API。