Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Důležité
Počínaje verzí 17.9 sady Visual Studio 2022 je nyní možné psát vizualizéry v .NET 6.0 nebo novějším, které běží mimo proces díky novému modelu VisualStudio.Extensibility. Informace o rozšířeních vytvořených pomocí nového modelu najdete v dokumentaci k vizualizérům ladicího programu sady Visual Studio . Pokud potřebujete podporovat starší verze sady Visual Studio nebo chcete odeslat vlastní vizualizéry jako součást knihovny DLL, použijte informace v tomto článku, které platí jenom pro starší model vývoje rozšíření (VSSDK).
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: Vytvoření vizualizátoru ve Visual Basicu
- 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 nejsou podporovány pro univerzální platformu Windows (UPW) a aplikace pro 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:
V rámci ladicího programu sady Visual Studio se spustí komponenta, která 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.
Debugger přijímá datový objekt od zprostředkovatele objektu, který implementuje rozhraní IVisualizerObjectProvider. 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řekonfigurujete zprostředkovatele objektu tak, aby komunikoval 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 bezpečnostní rizika. Viz aspekty zabezpečení vizualizéru.
Vytvořte uživatelské 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 DialogDebuggerVisualizer, a přepíšete metodu Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show, abyste zobrazili rozhraní. Ve vizualizéru můžete IDialogVisualizerService zobrazovat formuláře Windows, dialogy a ovládací prvky.
Pomocí IVisualizerObjectProvider metod získáte vizualizovaný objekt v debuggeru.
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 počínaje Visual Studio 2022 verzí 17.11 schopny určit Legacy zásadu 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, abyste zobrazili své 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 o zabezpečení, které se týkají jeho neopravitelných zranitelností. 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
objectProviderobjekt na aktualizované uživatelské rozhraní.Při odesílání objektů, jako jsou příkazy nebo data, na stranu laděného procesu, použijte metodu
IVisualizerObjectProvider2.Serialize, která předá objekt do datového proudu. Metoda automaticky určí nejlepší serializační formát, který se má použít na základě modulu runtime procesu laděného procesu. Pak předejte stream metoděIVisualizerObjectProvider2.TransferData.Pokud komponenta vizualizéru na straně vyšetřovaného programu potřebuje vrátit cokoli zpět na stranu debuggeru, bude to umístěno v objektu vráceném metodou. Použijte metodu
IVisualizerObjectProvider2.GetDeserializableObjectFrompro získání instance IDeserializableObject a její zpracování podle potřeby; nebo použijte DeserializeFromJson, pokud je to typ, který víte, jak deserializovat.
Pokud chcete zjistit, jaké další změny jsou nutné na straně laděného procesu při nepodporovaném použití binární serializace, podívejte se do části Zvláštní úvahy pro laděný proces ve .NET 5.0+.
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 DebuggerVisualizerAttribute, aby měl typ, který má být vizualizován (zdroj objektu na straně laděného programu).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ě debuggee.
V kódu na straně debugovaného:
Aby vizualizér mohl upravit datové objekty, musí zdroj objektu dědit z VisualizerObjectSource a přepsat metody
TransferDataneboCreateReplacementObject.Pokud potřebujete ve vizualizéru podporovat multi-targeting, můžete v souboru projektu na straně cílového programu použít následující Target Framework Monikers (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ácená hodnota IDeserializableObject pomáhá určit formát serializace objektu (binární nebo JSON) a deserializovat podkladový objekt tak, aby mohl být použit.Pokud strana debuggovaného programu vrátí data na stranu debuggeru jako součást
TransferDatavolání, serializujte odpověď do streamu strany debuggeru prostřednictvím metody Serialize.