创建在所有对象上运行的C#VS2010可视化工具
我正在尝试创建一个C#调试可视化工具,它可以对所有对象执行可视化。我似乎无法获得assembly属性(位于名称空间上方)以将此可视化工具绑定到System.Object,就像我能够与系统中的其他对象绑定一样。我已经搜索了很长时间,但没有找到任何关于为所有对象创建可视化工具的示例/讨论。这是我正在尝试使用的代码,当绑定到String或Int32时,它可以很好地工作,但不能绑定到Object或Object创建在所有对象上运行的C#VS2010可视化工具,c#,visual-studio-2010,visualizer,C#,Visual Studio 2010,Visualizer,我正在尝试创建一个C#调试可视化工具,它可以对所有对象执行可视化。我似乎无法获得assembly属性(位于名称空间上方)以将此可视化工具绑定到System.Object,就像我能够与系统中的其他对象绑定一样。我已经搜索了很长时间,但没有找到任何关于为所有对象创建可视化工具的示例/讨论。这是我正在尝试使用的代码,当绑定到String或Int32时,它可以很好地工作,但不能绑定到Object或Object [assembly: System.Diagnostics.DebuggerVisualize
[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程序员,我习惯于在调试模式下看到特定引用指向的堆地址。这使您可以一目了然地看到两个对象是否相等。此外,还有一些其他有价值的事情需要了解,但要解释可能会有点冗长。如果我能让它工作,我会张贴最后的代码
那么,有人知道如何使可视化工具对所有对象都处于活动状态吗?我不知道您的代码出了什么问题。 但是@Bismark,目标不必能够序列化,因为您可以使用自己的
VisualizationRobjectSource
对其进行序列化
我建议您将
.GetType().AsseblyQualifierName
与它一起序列化,这将允许您确定流包含什么类型的对象,因此在反序列化时,您知道您的对象实际上是类x
的实例,我在自己的可视化工具中使用了这种技术,因为有时您可能正在序列化类的一个子类型,而在反序列化时,您不知道正在使用的是什么时间。为什么您需要知道assembly system.object所在的位置?我看不出您显然在哪里引用程序集。抱歉,我应该使用属性not reference,editing。如果您需要比较两个相等的对象,只需使用调试器监视窗口,在其中输入变量名称,然后从每个变量的弹出菜单中执行“生成对象ID”。如果它们具有相同的对象id,则表示它们指向相同的对象引用。如果我错了,请更正我,但DebuggerVisualizer
的Target
属性不应指向可序列化的数据类型?