【问题标题】:Debugger Visualizer - Magnifying Glass not showing up调试器可视化工具 - 放大镜未显示
【发布时间】:2013-03-27 17:40:39
【问题描述】:

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

当我将鼠标悬停在我为其创建可视化工具的变量上时,应该有放大镜,但事实并非如此。显然,visual studio 并没有告诉我哪里出了问题。

以下代码位于可视化库中(面向 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);
    }
}

我的测试控制台应用程序:

internal class Program
{
    #region Static Methods

    private static void Main(string[] args)
    {
        var value = new ColorRGBA8{R=255};
        ColorRGBA8Visualizer.TestShowVisualizer(value);
    }

    #endregion
}

对话框显示得很好,但整个该死的点是当鼠标悬停在变量“value”上时,显示对话框的按钮出现在这一点上。

是的,我的可视化器库通过构建库输出到“C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\Visualizers”:所有必需的引用也会被复制。

Here's what it looks like in my debugger

That's what I expected it to look like

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

编辑

这是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);
    }
}

【问题讨论】:

    标签: c# visual-studio-2010 visual-studio


    【解决方案1】:

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

    注意:我没有很好的解释为什么这种行为是这样的。这在逻辑上没有意义,但在实验上它证明了

    【讨论】:

    • 非常感谢。这个问题把我逼疯了。我的代码为什么不能开箱即用,这真的很令人困惑。
    • @Simon 是的,这很令人惊讶,这就是问题所在。我只是幸运地猜测泛型可能是问题
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多