调试器可视化器-放大镜不显示

本文关键字:显示 放大镜 可视化 调试器 | 更新日期: 2023-09-27 18:06:04

我已经开始编写一个调试器可视化库,但是它并没有像预期的那样工作。

当我将鼠标悬停在我创建可视化器的变量上时,放大镜应该在那里,但它不是。很明显,visual studio并没有告诉我哪里出了问题。

以下代码位于visualizer库中(目标为4.0的类库项目)。

调试器对话框:

[assembly: DebuggerVisualizer(
typeof(ColorRGBA8Visualizer),
typeof(Serializer<ColorRGBA8>),
Target = typeof(ColorRGBA8),
Description = "ColorRGBA8 Visualizer")]
public class ColorRGBA8Visualizer
    : DialogDebuggerVisualizer
{
    public static void TestShowVisualizer(object objectToVisualize)
    {
        var visualizerHost = new VisualizerDevelopmentHost(objectToVisualize,
            typeof(ColorRGBA8Visualizer),
            typeof(Serializer<ColorRGBA8>));
        visualizerHost.ShowVisualizer();
    }
    protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        var color = Serializer<ColorRGBA8>.GetValue(objectProvider);
        using (var form = new Form())
        {
            form.Text = "Color Visualizer";
            form.BackColor = Color.FromArgb(255, color.R, color.G, color.B);
            form.Size = new Size(100, 10);
            windowService.ShowDialog(form);
        }
    }
}

自定义序列化器,因为我需要它来处理更复杂的对象:

public class Serializer<T>
    : VisualizerObjectSource
{
    public static T GetValue(IVisualizerObjectProvider provider)
    {
        var serializer = new DataContractSerializer(typeof (T));
        var transport = (MemoryStream) provider.GetObject();
        var value = serializer.ReadObject(transport);
        return (T) value;
    }
    public override void GetData(object target, Stream outgoingData)
    {
        var value = (T) target;
        var transport = new MemoryStream();
        var serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(transport, value);
        transport.Position = 0;
        base.GetData(transport, outgoingData);
    }
}

My Test Console Application:

internal class Program
{
    #region Static Methods
    private static void Main(string[] args)
    {
        var value = new ColorRGBA8{R=255};
        ColorRGBA8Visualizer.TestShowVisualizer(value);
    }
    #endregion
}

对话框显示得很好,但关键是要有一个按钮来显示对话框,当鼠标悬停在变量"value"上时。

是的,我的visualizer库是通过构建库输出到"C:'Program Files (x86)'Microsoft Visual Studio 10.0'Common7'Packages'Debugger'Visualizers":所有必需的引用也被复制。

在我的调试器

中是这样的

这就是我期望的样子

谁能告诉我我错过了什么?

编辑

这是JaredPar建议的解决方案。由于某些未知的原因,visual studio拒绝使用泛型序列化器,即使它们被指定为封闭类型,如Serializer.

public class ColorRGBA8Serializer
    : VisualizerObjectSource
{
    public static ColorRGBA8 GetValue(IVisualizerObjectProvider provider)
    {
        var serializer = new DataContractSerializer(typeof(ColorRGBA8));
        var transport = (MemoryStream)provider.GetObject();
        var value = serializer.ReadObject(transport);
        return (ColorRGBA8)value;
    }
    public override void GetData(object target, Stream outgoingData)
    {
        var value = (ColorRGBA8)target;
        var transport = new MemoryStream();
        var serializer = new DataContractSerializer(typeof(ColorRGBA8));
        serializer.WriteObject(transport, value);
        transport.Position = 0;
        base.GetData(transport, outgoingData);
    }
}

调试器可视化器-放大镜不显示

问题似乎是您对DebuggerVisualizerAttribute的第二个参数使用了泛型类型。可视化系统在泛型方面受到限制,并且由于某种原因,它似乎在此位置拒绝泛型。我能够让表单显示使用您的代码只更改可视化工具源参数为非泛型

注意:我没有一个很好的解释为什么行为是这样的。逻辑上讲不通,但实验证明