簡體   English   中英

Visual Studio調試器如何確定可以使用Text / XML / HTML Visualizer查看哪些值?

[英]How does the Visual Studio debugger decide which values can be viewed with the Text/XML/HTML Visualizer?

我注意到當我在Visual Studio的Watch窗口中查看某些類型的變量(如XElement )時,如果單擊Debug Visualizers放大鏡,則會出現應用於字符串(Text,XML,HTML)的相同可視化工具。 我之前沒有看到過這種情況。 調試器如何決定這樣做?

編輯:這是Watch窗口的截圖,演示了使用Text Visualizer顯示XElement,而System.Version(也實現了ToString)則沒有。 在此輸入圖像描述

這實際上是一個復雜的問題,因為表達式賦值器的多個部分控制着自定義查看器的顯示。

對於Text,XML和HTML查看器,答案非常簡單,因為它們是內置於調試器中的可視化器。 如果IDebugProperty2::GetPropertyInfoDBG_ATTRIB_VALUE_RAW_STRING作為屬性標志的一部分返回, DBG_ATTRIB_VALUE_RAW_STRING顯示此可視化工具。 當用戶選擇這些查看器時,調試器將回調到IDebugProperty3::GetStringChars / GetStrigCharLength ,以便將字符串值傳遞給可視化工具。

對於用戶定義的可視化工具雖然它涉及到相當多的參與,但這里的答案可能有點多。 MSDN確實有一些關於如何做到這一點的信息

http://msdn.microsoft.com/en-us/library/vstudio/bb162331(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/vstudio/bb146621(v= VS.100)的.aspx

現在讓我們考慮一下這個問題中提到的具體示例: Version vs. XElement 首先要注意的是,根據您正在調試的語言,您會得到不同的行為。正如您所注意到的,C#僅顯示XElement的可視化工具,而VB.Net將顯示XElementVersion的可視化工具。 這在某些方面並不令人驚訝,因為可視化器標志由EE控制,並且每種語言都有自己的實現

C#算法

如果該值鍵入String或具有到XNode的隱式引用轉換,則顯示可視化工具。

在這種情況下, XElement派生自XNode因此它獲得可視化器。 Version類型不是從XNode派生的,它不是String因此它不能獲得可視化器

VB.Net算法

如果顯示的值滿足以下值之一,則顯示可視化器

  1. String或具有ToString覆蓋
  2. 有一個DebuggerDisplay ,它指向一個符合1或2條件的值

在這種情況下, XElementVersion覆蓋ToString因此在兩種情況下都會顯示可視化工具

為什么不同?

甘拜下風。 當我編寫VB.Net實現時,我想在盡可能多的地方支持可視化工具(它非常有用)。 因此,無論何時顯示的最終值是String我都會顯示可視化工具。 當我做出這個決定時,我真的不想去咨詢C#團隊。 直到我研究代碼庫來回答這個問題,我甚至都不知道有什么區別:)

調試器如何決定這樣做?

它有一個可視化器注冊表,具體取決於對象類型。

你可以自由寫自己的。

如果您沒有看到可視化工具,則根本沒有注冊。 VS帶有一些很好的標准配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM