對使用 System.Deployment.Application 的 ClickOnce 應用程式進行偵錯

在 Visual Studio 中,ClickOnce 部署可讓您設定應用程式的更新方式。 不過,如果需要使用和自訂進階 ClickOnce 部署功能,則您必須存取 System.Deployment.Application 所提供的部署物件模型。 您可以將 System.Deployment.Application API 用於進階工作,例如:

  • 在您的應用程式中建立 [立即更新] 選項

  • 各種應用程式元件的條件式隨選下載

  • 直接整合至應用程式的更新

  • 保證用戶端應用程式一律為最新狀態

    由於 System.Deployment.Application API 只有在使用 ClickOnce 技術部署應用程式時才能運作,因此偵錯這些 API 的唯一方式為使用 ClickOnce 部署應用程式、附加至該應用程式,然後進行偵錯。 儘早附加偵錯工具可能很困難,因為此程式碼通常會在應用程式啟動時執行,並在您可以附加偵錯工具之前執行。 解決方案是在您的更新檢查程式碼或隨選程式碼之前放置中斷點 (或停止 Visual Basic 專案)。

    建議的偵錯技術如下:

注意

.NET Core 和 .NET 5 和更新版本中不支援 System.Deployment.Application 命名空間中的 ApplicationDeployment 類別和 API。 .NET 7 支援存取應用程式部署屬性的新方法。 如需詳細資訊,請參閱在 .NET 中存取 ClickOnce 部署屬性。 .NET 7 不支援 ApplicationDeployment 方法的同等項。

  1. 開始之前,請確定已封存符號 (.pdb) 檔案和來源檔案。

  2. 部署應用程式第 1 版。

  3. 建立新的空白解決方案。 從 [檔案] 功能表中,按一下 [新增],然後按一下[專案]。 在 [新增專案] 對話方塊中,開啟 [其他專案類型] 節點,然後選取 [Visual Studio Solutions] 資料夾。 在 [範本] 窗格中,選取 [空白解決方案]

  4. 將封存的來源位置新增至這個新解決方案的屬性。 在 [方案總管] 中,以滑鼠右鍵按一下解決方案名稱,然後按一下 [屬性]。 在 [屬性頁面] 對話方塊中,選取 [偵錯來源檔案],然後新增所封存原始程式碼的目錄。 否則,偵錯工具將會找到過期的來源檔案,因為來源檔案路徑記錄在 .pdb 檔案中。 如果偵錯工具使用過期的來源檔案,您會看到一則訊息,告知您來源不符。

  5. 確定偵錯工具可以找到 .pdb 檔案。 如果您已使用應用程式部署這些檔案,偵錯工具會自動尋找這些檔案。 其一律會先在有問題的元件旁邊尋找。 否則,您必須將封存路徑新增至 [符號檔案 (.pdb) 位置] (若要存取此選項,請從 [工具] 功能表按一下 [選項],然後開啟 [偵錯] 節點,並按一下 [符號])。

  6. 對在 CheckForUpdateDownload/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 方法,或直接使用 Visual Basic 中的 Stop。 當然,您不應該將這些方法呼叫留在實際執行程式碼中。

    例如,假設您正在開發 Windows Forms 應用程式,而且您具有適用於此方法的事件處理常式,其中包含更新邏輯。 若要對此進行偵錯,只要在按下按鈕之前附加,然後設定中斷點 (確定您開啟適當的封存檔案,並在該處設定中斷點)。

    只有在部署應用程式時,才會使用 IsNetworkDeployed 屬性來叫用 System.Deployment.Application API;在 Visual Studio 進行偵錯期間不應該叫用 API。