偵錯工具視覺化工具的架構有兩個部分:
偵錯工具端會在 Visual Studio 偵錯工具內執行。 偵錯工具端程式碼會建立並顯示視覺化工具的使用者介面。
偵錯人端會在 Visual Studio 正在偵錯的程式內執行 (偵錯人) 。
視覺化工具是偵錯工具元件,可讓偵錯工具以有意義、可理解的形式顯示 (視覺化) 資料物件的內容。 某些視覺化工具也支援編輯資料物件。 藉由撰寫自訂視覺化工具,您可以擴充偵錯工具來處理您自己的自訂資料類型。
要視覺化的資料物件位於您正在偵錯的處理程序 ( 偵錯對象 處理程序) 內。 將顯示資料的使用者介面是在 Visual Studio 偵錯工具程式內建立:
| 偵錯程式 | 偵錯者程式 |
|---|---|
| 偵錯工具使用者介面 (DataTips、監看視窗、QuickWatch) | 要視覺化的資料物件 |
若要視覺化偵錯工具介面內的資料物件,您需要程式碼來在兩個進程之間進行通訊。 因此,視覺化工具架構由兩部分組成: 偵錯工具端 程式碼和 偵錯者端 程式碼。
偵錯工具端程式碼會建立自己的使用者介面,可從偵錯工具介面叫用,例如 DataTip、監看視窗或 QuickWatch。 使用DialogDebuggerVisualizer類別和IDialogVisualizerService介面建立視覺化工具介面。 如同所有視覺化工具 API,DialogDebuggerVisualizer 和 IDialogVisualizerService 位於命名空間中 Microsoft.VisualStudio.DebuggerVisualizers 。
| 偵錯工具端 | 偵錯者端 |
|---|---|
| DialogDebuggerVisualizer 類別 IDialogVisualizerService 介面 |
資料物件 |
使用者介面會從偵錯工具端存在的物件提供者取得要視覺化的資料:
| 除錯器端 | 偵錯者端 |
|---|---|
| DialogDebuggerVisualizer 類別 IDialogVisualizerService 介面 |
資料物件 |
| 物件提供者 (實作 IVisualizerObjectProvider) |
偵錯對象端有一個對應的物件,稱為物件來源:
| 偵錯工具部分 | 偵錯者端 |
|---|---|
| DialogDebuggerVisualizer 類別 IDialogVisualizerService 介面 |
資料物件 |
| 物件提供者 (實作 IVisualizerObjectProvider) | 物件來源 (衍生自 VisualizerObjectSource) |
「物件提供者」提供要視覺化至視覺化工具 UI 的物件資料。 物件提供者會從物件來源取得物件資料。 物件提供者和物件來源提供 API,可在偵錯工具端與偵錯人端之間通訊物件資料。
每個視覺化工具都必須取得要視覺化的資料物件。 下表顯示物件提供者和物件來源用於此目的的對應 API:
| 物件提供者 | 物件來源 |
|---|---|
| GetData —或— GetObject |
GetData |
請注意,物件提供者可以使用 GetData 或 GetObject。 任一 API 都會呼叫 GetData 于物件來源上。 對 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData 的呼叫會填入 System.IO.Stream,這代表正在被視覺化的物件的序列化形式。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject 將資料還原序列化回物件形式,然後您可以在使用 DialogDebuggerVisualizer建立的 UI 中顯示該資料。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData 將資料填入為原始 Stream資料,您必須自行反序列化。
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetObject 透過呼叫 Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData 來取得序列化的 Stream,然後反序列化資料。 當物件無法由 .NET 序列化,且需要自訂序列化時使用 Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.GetData 。 在此情況下,您也必須覆寫該 Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.Serialize 方法。
如果您要建立唯讀視覺化工具,單向通訊與 GetData 或 GetObject 就足夠了。 如果您要建立支援編輯資料物件的視覺化工具,則必須執行更多動作。 您也必須能夠將資料物件從物件提供者傳送回物件來源。 下表顯示用於此目的的物件提供者和物件來源 API:
| 物件提供者 | 物件來源 |
|---|---|
| ReplaceData —或— ReplaceObject |
CreateReplacementObject |
再次請注意,物件提供者可以使用兩個 API。 資料一律會以Stream的形式從物件提供者傳送至物件來源,但ReplaceData需要您自行將物件序列化為Stream。
ReplaceObject 取得您提供的物件,將它序列化為 Stream,然後呼叫 ReplaceData 將 傳送 Stream 至 CreateReplacementObject。
使用其中一個 Replace 方法會在偵錯對象中建立新的資料物件,以取代正在視覺化的物件。 如果您想要變更原始物件的內容而不取代它,請使用下表所示的其中一種傳輸方法。 這些 API 會同時在兩個方向上傳輸資料,而不會取代正在視覺化的物件:
| 物件提供者 | 物件來源 |
|---|---|
| TransferData —或— TransferObject |
TransferData |