共用方式為


逐步解說:在 C# 中撰寫可視化工具

這很重要

從 Visual Studio 2022 版本 17.9 開始,現在可以使用新的 VisualStudio.Extensibility 模型撰寫外部進程運行的 .NET 6.0+ 可視化檢視器。 如需使用新模型建立的延伸模組,請參閱在建立 Visual Studio 偵錯工具可視化器中的文件。 如果您需要支援舊版 Visual Studio,或想要將自訂視覺化工具作為程式庫 DLL 的一部分進行發佈,請參考本文中的資訊,本資訊僅適用於舊版的擴充開發模型(VSSDK)。

本逐步解說示範如何使用 C# 撰寫簡單的可視化檢視。 您在本逐步解說中建立的可視化檢視會使用 Windows Form 顯示字串的內容。 這個簡單的字串可視化檢視本身並不特別有用,但它會顯示您必須遵循的基本步驟,為其他數據類型建立更實用的可視化檢視。

備註

您看到的對話框和功能表命令可能與 [說明] 中描述的有所不同,這取決於您的設定或版本。 若要變更您的設定,請移至 [ 工具] 功能表,然後選擇 [ 匯入和匯出設定]。 如需詳細資訊,請參閱 重設設定

可視化檢視程式代碼必須放在調試程式讀取的 DLL 檔案中。 因此,第一個步驟是建立 DLL 的類別庫專案。

手動建立視覺化工具

完成下列工作以建立可視化檢視。

建立類別庫專案

  1. 若要建立新的類別庫專案,請選取 [ 檔案>>專案]。

  2. 在語言下拉式清單中,選取 [C#]。

  3. 在搜尋方塊中,輸入 類別庫。 選取 [類別庫][.NET Framework], 然後選取 [ 下一步]。

  4. 在對話框中,輸入名稱 MyFirstVisualizer,然後選取 [ 建立]。

針對可視化檢視專案,請確定您選取 .NET Framework 類別庫,而不是 .NET。 雖然可視化檢視必須是 .NET Framework,但呼叫的應用程式可以是 .NET。

建立類別庫之後,您必須新增 Microsoft.VisualStudio.DebuggerVisualizers.DLL 檔案的參考,才能使用該處定義的類別。 新增參考之前,您必須將某些類別重新命名為使用有意義的名稱。

重新命名Class1.cs並新增 Microsoft.VisualStudio.DebuggerVisualizers

  1. [方案總管] 中,右鍵點擊 Class1.cs,然後選取快顯功能表上的 [重新命名]

  2. 將名稱從Class1.cs變更為有意義的專案,例如DebuggerSide.cs。

    備註

    Visual Studio 會自動變更 DebuggerSide.cs 中的類別宣告,以符合新的檔名。 如果您看到完成動作的提示,請選取 [ ]。

  3. [方案總管] 中,以滑鼠右鍵按兩下 [ 參考 ],然後選擇快捷方式功能表上的 [ 新增參考 ]。

  4. 在 [ 新增參考] 對話方塊的 [ 瀏覽 ] 索引標籤上,選取 [ 瀏覽 ] 並尋找 Microsoft.VisualStudio.DebuggerVisualizers.DLL。

    您可以在 Visual Studio 安裝目錄<\Common7\IDE\PublicAssemblies 子目錄中找到 DLL>

  5. 請選擇 [確定]

  6. 在 DebuggerSide.cs 中,將下列內容新增至 using 指示詞:

    using Microsoft.VisualStudio.DebuggerVisualizers;
    

現在您已準備好建立調試程式端程序代碼。 此程式代碼會在調試程式內執行,以顯示您想要可視化的資訊。 首先,您必須將 DebuggerSide 物件的宣告變更,以配置從基類 DialogDebuggerVisualizer 的繼承。

繼承自 DialogDebuggerVisualizer

  1. 在 DebuggerSide.cs 中,找到以下程式碼行:

    public class DebuggerSide
    
  2. 將程式代碼變更為:

    public class DebuggerSide : DialogDebuggerVisualizer
    
  3. 新增一個空的建構函式,以便將用於在可視化檢視元件之間進行通訊的序列化策略傳遞到基類的建構函式。

    public DebuggerSide() : base(FormatterPolicy.NewtonsoftJson) // or FormatterPolicy.Json
    {
    }
    

    備註

    由於 .NET 5.0+ 的特殊調試程式端考慮中所述的安全性問題,從 Visual Studio 2022 17.11 版開始,可視化檢視將無法指定 Legacy 格式器原則。

  4. DialogDebuggerVisualizer 有一個抽象方法(Show)您必須覆寫。

覆寫 DialogDebuggerVisualizer 顯示 方法

在 中 public class DebuggerSide,新增下列 方法:

protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
{
}

Show方法包含實際建立可視化檢視對話方塊或其他使用者介面的程式代碼,並顯示已從調試程式傳遞至可視化檢視的資訊。 您必須新增建立對話框的程序代碼,並顯示資訊。 在本逐步解說中,您會使用 Windows Forms 消息框。 首先,您必須新增 System.Windows.Forms 的參考和 using 指令。

新增 System.Windows.Forms

  1. [方案總管] 中,以滑鼠右鍵按兩下 [ 參考 ],然後選擇快捷方式功能表上的 [ 新增參考 ]。

  2. 在 [ 新增參考] 對話框的 [ 流覽 ] 索引標籤上,選取 [ 流覽],然後尋找System.Windows.Forms.DLL。

    您可以在 C:\Windows\Microsoft.NET\Framework\v4.0.30319 中找到 DLL。

  3. 請選擇 [確定]

  4. 在 DebuggerSide.cs 中,將下列內容新增至 using 指示詞:

    using System.Windows.Forms;
    

現在,您會新增一些程式碼來建立並顯示可視化檢視的使用者介面。 由於此範例是您的第一個可視化檢視,因此您可以讓使用者介面保持簡單,並使用消息框。

在對話框中顯示可視化檢視輸出

  1. Show 方法中,新增下列程式碼行:

    MessageBox.Show(objectProvider.GetObject().ToString());
    

    此範例程式代碼不包含錯誤處理。 您應該在實際的視覺化檢視或任何其他應用程式類型中包含錯誤處理。

  2. 在 [ 建置] 功能表上,選擇 [ 建置 MyFirstVisualizer]。 項目應該會順利建置。 在繼續之前,請先更正任何建置錯誤。

調試程式端程式代碼現在已完成。 不過,還有一步需要完成:設定一個屬性,該屬性用來告知偵錯對象端哪些類別的集合組成了這個可視化工具。

新增要視覺化的類型以呈現被調試端的程式碼

在 debugger 端的程式碼中,您會使用 DebuggerVisualizerAttribute 屬性指定要可視化的型別(物件來源)以供偵錯應用程式使用。 這個屬性會設定要視覺化的Target 類型。

  1. 將下列屬性新增至 DebuggerSide.cs,在 using 指令之後,但在 namespace MyFirstVisualizer 之前:

    [assembly:System.Diagnostics.DebuggerVisualizer(
    typeof(MyFirstVisualizer.DebuggerSide),
    typeof(VisualizerObjectSource),
    Target = typeof(System.String),
    Description = "My First Visualizer")]
    
  2. 在 [ 建置] 功能表上,選擇 [ 建置 MyFirstVisualizer]。 項目應該會順利建置。 在繼續之前,請先更正任何建置錯誤。

    此時,您的第一個可視化檢視已完成。 如果您已正確遵循這些步驟,您可以建置可視化檢視並將其安裝至 Visual Studio。 不過,在將可視化檢視安裝到 Visual Studio 之前,您應該先測試它,以確定它能夠正確執行。 您現在會建立測試控管來執行可視化檢視,而不需要將它安裝到 Visual Studio 中。

新增測試方法以顯示視覺化工具

  1. 將下列方法新增至 類別 public DebuggerSide

    public static void TestShowVisualizer(object objectToVisualize)
    {
       VisualizerDevelopmentHost visualizerHost = new VisualizerDevelopmentHost(objectToVisualize, typeof(DebuggerSide));
       visualizerHost.ShowVisualizer();
    }
    
  2. 在 [ 建置] 功能表上,選擇 [ 建置 MyFirstVisualizer]。 項目應該會順利建置。 在繼續之前,請先更正任何建置錯誤。

    接下來,您必須建立可執行的專案來呼叫可視化檢視 DLL。 為了簡單起見,請使用主控台應用程式專案。

將主控台應用程式專案新增至方案

  1. 在 [方案總管] 中,以滑鼠右鍵按兩下方案,選擇 [ 新增],然後選取 [ 新增專案]。

  2. 選擇 [ 檔案>>專案]。 在語言下拉式清單中,選擇 [C#]。 在搜尋方塊中,輸入 主控台應用程式,然後選擇 主控台應用程式 (.NET Framework) 或適用於 .NET 的 控制台應用程式 。 選取 下一步。 在出現的對話框中,輸入名稱 MyTestConsole,然後選取 [ 建立]。

備註

如果您想要使用測試線束輕鬆地測試可視化檢視,請建立 .NET Framework 控制台應用程式。 您可以改為建立 .NET 控制台應用程式,但稍後所述的測試控管尚不支援 .NET,因此您必須安裝可視化檢視來測試它。 針對 .NET 控制台應用程式,請先在這裡建立控制台應用程式、新增必要的 DLL 和專案參考,然後遵循 新增偵錯端數據物件中所述的步驟。 如需 ASP.NET 核心案例,請參閱 .NET 5.0+ 的特殊調試程式端考慮

現在,您必須新增必要的參考,讓 MyTestConsole 可以呼叫 MyFirstVisualizer。

將必要的參考新增至 MyTestConsole

  1. [方案總管] 中,以滑鼠右鍵點擊 [MyTestConsole],然後選擇右鍵選單中的 [新增參考]。

  2. 在 [ 新增參考 ] 對話框中,開啟 [ 流覽] 索引標籤,然後選取 [Microsoft.VisualStudio.DebuggerVisualizers.DLL]。

  3. 請選擇 [確定]

  4. 以滑鼠右鍵按兩下 [MyTestConsole ],然後再次選擇 [ 新增參考 ]。

  5. 在 [ 新增參考] 對話框中,開啟 [ 專案 ] 索引卷標,然後選取 [MyFirstVisualizer]。

  6. 請選擇 [確定]

現在,您會新增程式碼以完成測試框架。

將程式代碼新增至 MyTestConsole

  1. 方案總管 中,以滑鼠右鍵按一下 Program.cs,然後從捷徑功能表中選擇 重新命名

  2. 將名稱從 Program.cs 編輯為更有意義的名稱,例如 TestConsole.cs。

    備註

    Visual Studio 會自動變更 TestConsole.cs 中的類別宣告,以符合新的檔名。

  3. 在 TestConsole.cs 中,將下列程式代碼新增至 using 指示詞:

    using MyFirstVisualizer;
    
  4. 在方法 Main中,新增下列程序代碼:

    String myString = "Hello, World";
    DebuggerSide.TestShowVisualizer(myString);
    

現在,您已準備好測試第一個可視化工具。

測試可視化工具

  1. [方案總管] 中,以滑鼠右鍵按兩下 [MyTestConsole ],然後選擇快捷方式功能表上的 [ 設定為啟始專案 ]。

  2. 在 [偵錯] 功能表上,選擇 [開始]。

    控制台應用程式隨即啟動,可視化檢視隨即出現,並顯示字串 「Hello, World」。。

祝賀。 您已建置並測試您的第一個可視化檢視!

如果您想在 Visual Studio 中使用您的視覺化工具,而不只是透過測試框架呼叫它,則必須進行安裝。 如需詳細資訊,請參閱 如何:安裝可視化檢視

新增 debuggee 端數據物件

在本節中,您會從 System.String 數據物件切換到自定義數據物件。

  1. 在 [方案總管] 中,以滑鼠右鍵按兩下方案,選擇 [ 新增],然後選取 [ 新增專案]。 在語言下拉式清單中,選擇 [C#]。 在搜尋方塊中,輸入 類別庫,然後選擇 [ 類別庫][.NET Framework] 或 [適用於 .NET Standard 的類別庫 ]。

    備註

    如果您使用 .NET Framework 測試控制台應用程式,請務必建立 .NET Framework 類別庫專案。

  2. 選取 下一步。 在出現的對話框中,輸入名稱 MyDataObject,然後選取 [ 建立]。

  3. (僅限.NET Standard 類別庫)在 [方案總管] 中,以滑鼠右鍵按兩下專案,然後選擇 [ 編輯項目檔]。 將 <TargetFramework> 值變更為 netstandard2.0

    <TargetFramework>netstandard2.0</TargetFramework>
    
  4. MyDataObject 命名空間內,將預設代碼取代為以下代碼。

    [Serializable] 
    public class CustomDataObject
    {
       public CustomDataObject()
       {
          this.MyData = "MyTestData";
       }
       public string MyData { get; set; }
    }
    

    對於唯讀可視化檢視,例如在此範例中,不需要實作 VisualizerObjectSource的方法。

    接下來,更新 MyFirstVisualizer 專案以使用新的數據物件。

  5. 在 MyFirstVisualizer 專案下的 [方案總管] 中,以滑鼠右鍵按兩下 [ 參考 ] 節點,然後選擇 [ 新增參考]。

  6. [專案] 底下,選取 MyDataObject 專案。

  7. 在 DebuggerSide.cs 的屬性代碼中,更新 Target 值,並將變更 System.StringMyDataObject.CustomDataObject

    Target = typeof(MyDataObject.CustomDataObject),
    
  8. 在 MyFirstVisualizer 專案中,以下列程式代碼 Show 取代 方法的程式代碼。

    var data = objectProvider.GetObject() as MyDataObject.CustomDataObject;
    
    // You can replace displayForm with your own custom Form or Control.  
    Form displayForm = new Form();
    displayForm.Text = data.MyData;
    windowService.ShowDialog(displayForm);
    

    上述程式代碼會使用資料物件的 屬性,在窗體的標題中顯示。

    接下來,更新主控台應用程式以使用自定義資料物件。

  9. 在 MyTestConsole 專案下的 [方案總管] 中,以滑鼠右鍵按兩下 [ 參考 ] 或 [ 相依性 ] 節點,並將項目參考新增至 MyDataObject

  10. 在 Program.cs 中,以下列程式代碼取代 方法中的 Main 程序代碼。

    // String myString = "Hello, World";
    CustomDataObject customDataObject = new CustomDataObject();
    
    DebuggerSide.TestShowVisualizer(customDataObject);
    
  11. (.NET 主控台應用程式)將呼叫 TestShowVisualizer 括在 try-catch 語句中,因為不支持測試支架。

    try
    {
          DebuggerSide.TestShowVisualizer(customDataObject);
    }
    catch (Exception) {
    }
    

    主控台應用程式需要可視化檢視的運行時間參考。 您可以保留上述程式代碼來維護參考,而不是將它註解掉。

  12. 針對 .NET Framework 控制台應用程式,您可以執行測試控管 (按 F5),也可以遵循 如何:安裝可視化檢視中的指示。

    如果您使用測試框架執行應用程式,應用程式會顯示 Windows 視窗表單。

  13. 針對 .NET 控制台應用程式,將 和 MyFirstVisualizer.dll 複製到MyDataObject.dll如何:安裝可視化檢視中所述的資料夾。

  14. 安裝可視化工具後,設定斷點,執行控制台應用程式並將滑鼠懸停在customDataObject上。 如果一切都已正確設定,您應該會看到放大鏡圖示 可視化圖示

    視覺化放大鏡圖示。

    當您從放大鏡中選擇 MyFirstVisualizer 時,您會在標題中看到具有數據物件文字的 Form。

    顯示「Windows Form」的可視化工具