共用方式為


Visual Studio 調試程式的自訂資料可視化檢視 (.NET)

這很重要

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

可視化檢視是 Visual Studio 調試程式使用者介面的一部分,以適合其數據類型的方式顯示變數或物件。 例如, 位圖可視化檢視 會解譯位圖結構,並顯示它所代表的圖形。 某些可視化檢視可讓您修改及檢視數據。 在調試程式中,可視化檢視是由放大鏡圖示 可視化檢視Icon來表示。 您可以在 [DataTip]、[調試程序 監看 式] 視窗或 [ 快速監看 式] 對話框中選取圖示,然後為對應的物件選取適當的可視化檢視。

除了 標準內建可視化檢視之外,其他可視化檢視也可以從Microsoft、第三方和社群下載。 您也可以撰寫自己的可視化檢視,並在 Visual Studio 調試程式中加以安裝。

本文提供可視化檢視建立的高階概觀。 如需詳細指示,請參閱下列文章:

備註

通用 Windows 平臺 (UWP) 和 Windows 8.x 應用程式不支援自定義可視化檢視。

概觀

您可以為任何受控類別的物件撰寫自定義可視化檢視,除了 ObjectArray

除錯程式視覺化檢視的 架構 有兩個部分:

  • 調試程式端會在 Visual Studio 調試程式內執行,並建立並顯示可視化檢視使用者介面。

    因為 Visual Studio 會在 .NET Framework 運行時間上執行,因此此元件必須針對 .NET Framework 撰寫。 基於這個理由,無法針對 .NET Core 撰寫它。

  • 待調試端在由 Visual Studio 偵錯的程序中執行(「偵錯組」)。 要可視化的數據物件(例如 String 物件)存在於偵錯組進程。 偵錯端會將物件傳送至偵錯器端,以在您所建立的使用者介面中顯示該物件。

    您建置此元件的執行階段應該符合偵錯中程序將會執行的環境,也就是 .NET Framework 或 .NET Core。

調試程式端會從實作 介面IVisualizerObjectProvider接收數據物件。 被偵錯端會透過物件來源傳送物件,該來源是由VisualizerObjectSource衍生而來的。

物件提供者也可以將數據傳回物件來源,這可讓您撰寫可編輯數據的可視化檢視。 您覆寫物件提供者以與表達式評估器和物件來源進行溝通。

受調試端和調試器端會透過 Stream 方法將資料物件序列化為 Stream,並將反序列化 Stream 成為資料物件進行彼此通訊。

只有當類型是開啟的類型時,才可以撰寫泛型類型的可視化檢視。 此限制與使用 DebuggerTypeProxy 屬性時的限制相同。 如需詳細資訊,請參閱 使用DebuggerTypeProxy屬性

自定義可視化檢視可能有安全性考慮。 請參閱 可視化檢視安全性考慮

建立調試程式端使用者介面

若要在調試程式端建立可視化檢視使用者介面,您可以建立繼承自 DialogDebuggerVisualizer的類別,並覆寫 Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show 方法以顯示介面。 您可以使用 IDialogVisualizerService 在視覺化檢視中顯示 Windows 表單、對話框和控制件。

  1. 使用 IVisualizerObjectProvider 方法來取得調試程式端的可視化物件。

  2. 建立繼承自 DialogDebuggerVisualizer的類別。

備註

由於下列章節所述的安全性問題,從 Visual Studio 2022 17.11 版開始,可視化檢視將無法在基類建構函式中指定 Legacy 格式器原則。 從現在開始,可視化檢視只能使用 JSON 串行化在調試程式和偵錯端元件之間進行通訊。

  1. 覆寫 Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show 方法以顯示您的介面。 使用 IDialogVisualizerService 方法,在您的介面中顯示 Windows 窗體、對話框和控件。

  2. 套用 DebuggerVisualizerAttribute,給予可視化器以顯示(DialogDebuggerVisualizer)。

.NET 5.0+ 的特殊調試程式端考慮

自定義可視化檢視預設會使用 類別,透過二進位串行化,在偵錯組BinaryFormatter端之間傳輸數據。 不過,由於其無法修復的弱點,這種序列化在 .NET 5 和更高版本出於安全性考慮而受到限制。 此外,它已在 ASP.NET Core 5 中標示為完全過時,其使用方式將會擲回 ,如 ASP.NET Core 檔中所述。 本節說明您應該採取的步驟,以確保此案例中仍支援可視化檢視。

  • 基於相容性考慮, 在上一節中覆寫的 Show 方法仍然需要接收一個 IVisualizerObjectProvider。 不過,從 Visual Studio 2019 16.10 版開始,它實際上的類型為 IVisualizerObjectProvider3。 基於這個理由,請將 objectProvider 物件轉換成更新的介面。

  • 將命令或數據等對象傳送至 偵錯gee 端 時,會使用 IVisualizerObjectProvider2.Serialize 方法將它傳遞至數據流,它會根據 偵錯gee 進程的運行時間判斷要使用的最佳串行化格式。 然後,將數據流傳遞至 IVisualizerObjectProvider2.TransferData 方法。

  • 如果 debuggee 端可視化檢視元件需要將任何資料傳回給調試程式端,它將會位於Stream方法所傳回的TransferData物件中。 使用IVisualizerObjectProvider2.GetDeserializableObjectFrom方法從中取得IDeserializableObject實例,並視需要加以處理;或者,如果它是您知道如何恢復序列化的型別,請使用DeserializeFromJson

請參閱 .NET 5.0+ 的特殊偵錯對象端考慮 一節,以瞭解在不支援二進位串行化時,偵錯對象端需要哪些其他變更。

備註

如果您想要有關此問題的詳細資訊,請參閱 BinaryFormatter 安全性指南

建立偵錯端的可視化檢視物件來源

在調試器端的代碼中,編輯 DebuggerVisualizerAttribute,指定要可視化的類型(調試對象端的來源)(VisualizerObjectSource)。 Target 屬性設定物件來源。 如果您省略物件來源,可視化檢視會使用預設物件來源。

偵錯專案端程式代碼包含可視化的物件來源。 數據物件可以覆寫VisualizerObjectSource的方法。 如果您想要建立獨立可視化檢視,則需要偵錯端 DLL。

在 debuggee 端程式代碼中:

  • 若要讓可視化檢視器能夠編輯數據物件,物件來源必須繼承自 VisualizerObjectSource 並覆寫 TransferDataCreateReplacementObject 方法。

  • 如果您需要在可視化檢視中支援多重目標,您可以在偵錯項目檔中使用下列 Target Framework Monikers (TFM)。

    <TargetFrameworks>net20;netstandard2.0;netcoreapp2.0</TargetFrameworks>
    

    這些是唯一支援的目標框架 (TFM)。

.NET 5.0+ 的特殊偵錯專案端考慮

這很重要

為了安全性考慮,自 .NET 5.0 開始,可視化工具可能需要其他步驟才能正常運作,這是由於預設使用的基礎二進位序列化方法帶來的問題。 請先 閱讀本節, 再繼續進行。

  • 如果可視化程序實作了 TransferData 方法,請使用最新版本 GetDeserializableObject 中新增的 VisualizerObjectSource 方法。 它會返回 IDeserializableObject,有助於判斷物件的序列化格式(二進位或 JSON),並將基礎物件反序列化,以便加以使用。

  • 如果被調試端將資料作為呼叫的一部分傳回到TransferData,請透過方法將回應串行化到Serialize