4

我正在尝试创建一个可以对所有对象执行可视化的 C# 调试可视化器。我似乎无法获得程序集属性(在命名空间之上)将此可视化器绑定到 System.Object,就像我已经能够与系统中的其他对象一样。我已经进行了详细搜索,但没有找到任何关于为所有对象创建可视化器的示例/讨论。这是我试图开始工作的代码,它在绑定到 String 或 Int32 时运行良好,但不是 Object 或 object。

[assembly: System.Diagnostics.DebuggerVisualizer(
typeof(Visualizers.ObjectVisualizer), typeof(Visualizers.RawObjectScource),
Target = typeof(object), Description = "Object Visualizer")]
namespace Visualizers
{
public class ObjectVisualizer : DialogDebuggerVisualizer
{
    override protected void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        Console.Out.WriteLine("InShow");
        MessageBox.Show(objectProvider.GetObject().ToString());
    }
}

// handle any object, doesn't require that it's Serializable
public class RawObjectScource : VisualizerObjectSource
{
    public override void GetData(object target, Stream outgoingData)
    {
        if (target != null)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(outgoingData, target.ToString());
        }
    }
}
}

作为使用 IntelliJ 的前 Java 程序员,我习惯于在调试模式下查看特定引用指向的堆地址。这使您可以一目了然地查看两个对象是否引用相等。此外,还有一些其他值得了解的事情,但解释起来可能有点冗长。如果我能让它工作,我会发布最终代码。

那么有谁知道如何让可视化器对所有对象都处于活动状态?

4

1 回答 1

0

我不知道你的代码有什么问题。但是@Bismark,目标不必序列化,因为您可以使用自己的序列化VisualizerObjectSource

我确实建议您将其与.GetType().AsseblyQualifierName它一起进行序列化,这将允许您了解流包含的对象类型,因此在反序列化时您知道您的对象实际上是类的一个实例x,我有时使用这种技术作为我自己的可视化工具之一可能会在反序列化时序列化该类的子类型,而您不知道自己的工作时间。

于 2011-10-21T21:33:06.990 回答