Vlastní vizualizéry dat pro ladicí program sady Visual Studio (.NET)
Důležité
Počínaje sadou Visual Studio 2022 verze 17.9 je teď možné vizualizéry napsat v .NET 6.0 nebo novějších, které využívají nový model VisualStudio.Extensibility. Autorům vizualizéru doporučujeme odkazovat na novou dokumentaci k vizualizérům ladicího programu sady Visual Studio, pokud nechtějí podporovat starší verze sady Visual Studio nebo chtějí odeslat vlastní vizualizéry jako součást knihovny DLL.
Vizualizér je součástí uživatelského rozhraní ladicího programu sady Visual Studio, které zobrazuje proměnnou nebo objekt způsobem odpovídajícím jeho datovému typu. Například vizualizér rastrového obrázku interpretuje rastrovou strukturu a zobrazí obrázek, který představuje. Některé vizualizéry umožňují upravovat a zobrazovat data. V ladicím programu je vizualizér reprezentován ikonou lupy . Ikonu můžete vybrat v okně DataTip, Watch ladicího programu nebo QuickWatch a pak vybrat příslušný vizualizér pro odpovídající objekt.
Kromě standardních integrovaných vizualizérů může být k dispozici ke stažení dalších vizualizérů od Microsoftu, třetích stran a komunity. Můžete také napsat vlastní vizualizéry a nainstalovat je do ladicího programu sady Visual Studio.
Tento článek obsahuje základní přehled vytváření vizualizéru. Podrobné pokyny najdete v následujících článcích:
- Návod: Zápis vizualizéru v jazyce C#
- Návod: Zápis vizualizéru v jazyce Visual Basic
- Instalace vizualizéru
- V dokumentaci k Natvis se podívejte na element UIVisualizer. Podívejte se také na ukázku vizualizéru nativního ladicího programu SQLite.
Poznámka:
Vlastní vizualizéry se nepodporují pro aplikace Univerzální platforma Windows (UPW) a Windows 8.x.
Přehled
Můžete napsat vlastní vizualizér pro objekt libovolné spravované třídy s výjimkou Object a Array.
Architektura vizualizéru ladicího programu má dvě části:
Na straně ladicího programu sady Visual Studio se spustí a vytvoří a zobrazí uživatelské rozhraní vizualizéru.
Vzhledem k tomu, že visual Studio se spouští v modulu runtime rozhraní .NET Framework, musí být tato komponenta zapsána pro rozhraní .NET Framework. Z tohoto důvodu není možné ji napsat pro .NET Core.
Na straně ladicího programu se spustí proces, který sada Visual Studio ladí ( ladicí prostředí). Datový objekt k vizualizaci (například objekt String) existuje v procesu ladění. Strana ladicího programu odešle objekt na stranu ladicího programu, který ho zobrazí v uživatelském rozhraní, které vytvoříte.
Modul runtime, pro který sestavíte tuto komponentu, by se měl shodovat s modulem, ve kterém se spustí proces ladění, tj. .NET Framework nebo .NET Core.
Strana ladicího programu přijímá datový objekt od zprostředkovatele objektu, který implementuje IVisualizerObjectProvider rozhraní. Ladicí strana odešle objekt prostřednictvím zdroje objektu, který je odvozen z VisualizerObjectSource.
Zprostředkovatel objektu může také odesílat data zpět do zdroje objektů, což umožňuje napsat vizualizér, který může upravovat data. Přepíšete zprostředkovatele objektu tak, aby mluvil s vyhodnocovačem výrazu a zdrojem objektů.
Ladicí strana a ladicí program vzájemně komunikují prostřednictvím Stream metod, které serializují datový objekt do Stream a deserializují Stream zpět do datového objektu.
Vizualizér pro obecný typ můžete napsat pouze v případě, že je typ otevřený. Toto omezení je stejné jako omezení při použití atributu DebuggerTypeProxy
. Podrobnosti najdete v tématu Použití atributu DebuggerTypeProxy.
Vlastní vizualizéry můžou mít důležité informace o zabezpečení. Viz aspekty zabezpečení vizualizéru.
Vytvoření uživatelského rozhraní na straně ladicího programu
Chcete-li vytvořit uživatelské rozhraní vizualizéru na straně ladicího programu, vytvoříte třídu, která dědí z DialogDebuggerVisualizera přepíše metodu Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show pro zobrazení rozhraní. Ve vizualizéru můžete IDialogVisualizerService zobrazit formuláře Windows, dialogy a ovládací prvky.
Pomocí IVisualizerObjectProvider metod získáte vizualizovaný objekt na straně ladicího programu.
Vytvoření třídy, která dědí z DialogDebuggerVisualizer.
Poznámka:
Vzhledem k problémům se zabezpečením popsaným v následující části nebudou vizualizéry od sady Visual Studio 2022 verze 17.11 moct určit Legacy
zásady formátovače v konstruktoru základní třídy. Od této chvíle můžou vizualizéry používat k komunikaci mezi ladicím programem a komponentami na straně ladění pouze serializaci JSON.
Přepište metodu Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show pro zobrazení rozhraní. Pomocí IDialogVisualizerService metod můžete ve svém rozhraní zobrazit formuláře Windows, dialogy a ovládací prvky.
Použít DebuggerVisualizerAttribute, čímž ho vizualizér zobrazí (DialogDebuggerVisualizer).
Zvláštní aspekty na straně ladicího programu pro .NET 5.0+
Vlastní vizualizéry přenášejí data mezi ladicím programem a stranami ladicího programu prostřednictvím binární serializace pomocí BinaryFormatter třídy ve výchozím nastavení. Tento druh serializace se ale v rozhraní .NET 5 a novějších omezuje kvůli obavám zabezpečení týkajícím se nefixovatelných ohrožení zabezpečení. Kromě toho byla v ASP.NET Core 5 označena zcela zastaralá a její využití se vyvolá podle popisu v dokumentaci ASP.NET Core. Tato část popisuje kroky, které byste měli provést, abyste měli jistotu, že váš vizualizér je v tomto scénáři stále podporovaný.
Z důvodu kompatibility metoda, Show která byla přepsána v předchozí části stále přebírá .IVisualizerObjectProvider Počínaje sadou Visual Studio 2019 verze 16.10 je však ve skutečnosti typu IVisualizerObjectProvider3. Z tohoto důvodu přetypujte
objectProvider
objekt na aktualizované rozhraní.Při odesílání objektů, jako jsou příkazy nebo data, do ladicího procesu použijte
IVisualizerObjectProvider2.Serialize
metodu k předání do datového proudu, určí nejlepší serializační formát, který se má použít na základě modulu runtime procesu ladění . Pak předejte stream metoděIVisualizerObjectProvider2.TransferData
.Pokud komponenta vizualizéru na straně ladicího programu potřebuje vrátit cokoli, bude umístěna v Stream objektu vrácené metodouTransferData. Použijte metodu
IVisualizerObjectProvider2.GetDeserializableObjectFrom
IDeserializableObject k získání instance z ní a její zpracování podle potřeby; nebo použijte DeserializeFromJson , pokud je to typ, který víte, jak deserializovat.
Poznámka:
Další informace o problému najdete v průvodci zabezpečením BinaryFormatter.
Vytvoření zdroje objektu vizualizéru pro stranu ladicího programu
V kódu na straně ladicího programu upravte DebuggerVisualizerAttributetyp, který chcete vizualizovat (zdroj objektu na straně ladění).VisualizerObjectSource Vlastnost Target
nastaví zdroj objektu. Pokud zdroj objektu vynecháte, vizualizér použije výchozí zdroj objektu.
Kód na straně ladicího programu obsahuje zdroj objektů, který se vizualizuje. Datový objekt může přepsat metody VisualizerObjectSource. Pokud chcete vytvořit samostatný vizualizér, je nutná knihovna DLL na straně ladění.
V kódu na straně ladění:
Aby vizualizér upravil datové objekty, musí zdroj objektu
TransferData
dědit a VisualizerObjectSource přepsat nebo přepsat metodyCreateReplacementObject
.Pokud potřebujete ve vizualizéru podporovat cílení na více verzí, můžete v souboru projektu na straně ladění použít následující monikers cílové architektury (TFM).
<TargetFrameworks>net20;netstandard2.0;netcoreapp2.0</TargetFrameworks>
Jedná se o jediné podporované TFM.
Zvláštní aspekty na straně ladění pro .NET 5.0+
Důležité
Aby vizualizér fungoval od verze .NET 5.0, může být potřeba provést další kroky kvůli obavám zabezpečení týkajícím se základní metody binární serializace používané ve výchozím nastavení. Než budete pokračovat, přečtěte si prosím tuto část .
Pokud vizualizér implementuje metodu TransferData , použijte nově přidanou GetDeserializableObject metodu, která je k dispozici v nejnovější verzi
VisualizerObjectSource
. Vrátí IDeserializableObject hodnotu pomáhá určit formát serializace objektu (binární nebo JSON) a deserializovat základní objekt tak, aby se mohl použít.Pokud ladicí program vrátí data na straně ladicího programu jako součást
TransferData
volání, serializujte odpověď na stream ladicího programu prostřednictvím Serialize metody.