Skip to content

Solution structure

Zev Spitz edited this page May 21, 2020 · 10 revisions

The original architecture for debugging visualizers was a single DLL. But with the arrival of Visual Studio 2019, and debugging non-Framework .NET implementations (.NET Core, .NET Standard), a new architecture has been introduced. Visualizers are split into two DLLs:

  1. a debugger component, loaded into Visual Studio
  2. and a debuggee component, loaded into the process being debugged.

If the target of the debugging visualizer is serializable, then the two components can pass the target object between them via serialization and deserialization. For expression trees -- which are not serializable -- we have to introduce a set of wrapper classes which pass the necessary information between the two components.

In addition, we want to package the UI components -- views and viewmodels -- in a NuGet package, for reuse in other projects.

To sum up, there are three compilation units:

  • debuggee component (Debuggee)
  • debugger component (Visualizer)
  • UI controls and viewmodels (Package)

There are also three shared projects:

  • Serialization -- the serializable wrapper classes, which are used by all three compilation units
  • UI -- shared UI components, used by Visualizer and Package

and two additional projects:

  • PostBuild -- building this project will copy the built visualizer DLLs into the appropriate folders
  • Tests.Visualizer -- unit tests on the view models
Project Namespace(s) Description
Debuggee ExpressionTreeVisualizer Debuggee component -- VisualizerDataObjectSource
Package ExpressionTreeVisualizer UI controls + viewmodels, as NuGet package
PostBuild Post-build event which copies the output DLLs to the visualizer folder
Serialization ExpressionTreeVisualizer.Serialization Wrapper classes used by Debuggee and Visualizer to communicate with one another
Tests.Visualizer ExpressionTreeVisualizer.Tests Automated tests
UI ExpressionTreeVisualizer Views and viewmodels
Visualizer ExpressionTreeVisualizer Debugger component

Note that some common functionality for visualizers is provided by Periscope.

The following is a table of how various pieces are spread out between the projects:

image