[英]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::GetPropertyInfo
將DBG_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將顯示XElement
和Version
的可視化工具。 這在某些方面並不令人驚訝,因為可視化器標志由EE控制,並且每種語言都有自己的實現
如果該值鍵入String
或具有到XNode
的隱式引用轉換,則顯示可視化工具。
在這種情況下, XElement
派生自XNode
因此它獲得可視化器。 Version
類型不是從XNode
派生的,它不是String
因此它不能獲得可視化器
如果顯示的值滿足以下值之一,則顯示可視化器
String
或具有ToString
覆蓋 DebuggerDisplay
,它指向一個符合1或2條件的值 在這種情況下, XElement
和Version
覆蓋ToString
因此在兩種情況下都會顯示可視化工具
甘拜下風。 當我編寫VB.Net實現時,我想在盡可能多的地方支持可視化工具(它非常有用)。 因此,無論何時顯示的最終值是String
我都會顯示可視化工具。 當我做出這個決定時,我真的不想去咨詢C#團隊。 直到我研究代碼庫來回答這個問題,我甚至都不知道有什么區別:)
調試器如何決定這樣做?
它有一個可視化器注冊表,具體取決於對象類型。
你可以自由寫自己的。
如果您沒有看到可視化工具,則根本沒有注冊。 VS帶有一些很好的標准配置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.