Visual studio 正在尝试使DataRow[]调试器可视化工具在Visual Studio 2010中工作

Visual studio 正在尝试使DataRow[]调试器可视化工具在Visual Studio 2010中工作,visual-studio,visual-studio-2010,Visual Studio,Visual Studio 2010,我正在尝试让DataRow[]DebuggerVisualizer为VisualStudio 2010工作,但不幸的是,我无法让它工作。我可以让DataRow一号正常工作,但不能让DataRow[]正常工作,请给我一些好吗 代码的核心在这里 [程序集:调试可视化工具]( 类型(PCHenry.DR), 类型(PCHenry.DRObjectSource), 目标=类型(数据行[]), Description=“DataRow数组调试器可视化工具(如果您看到这个,那么它正在工作!)” 名称空间P

我正在尝试让DataRow[]DebuggerVisualizer为VisualStudio 2010工作,但不幸的是,我无法让它工作。我可以让DataRow一号正常工作,但不能让DataRow[]正常工作,请给我一些好吗

代码的核心在这里


[程序集:调试可视化工具](
类型(PCHenry.DR),
类型(PCHenry.DRObjectSource),
目标=类型(数据行[]),
Description=“DataRow数组调试器可视化工具(如果您看到这个,那么它正在工作!)”
名称空间PCHenry
{
公共类DR:DialogDebuggerVisualizer
{
受保护的覆盖无效显示(IDialogVisualizerService WindowsService、IVisualizerObjectProvider objectProvider)
{
StringBuilder stringToDebug=新建StringBuilder();
使用(Stream dataStream=objectProvider.GetData())
{
BinaryFormatter formatter=新的BinaryFormatter();
string incomingData=格式化程序。将(数据流)反序列化为字符串;
追加(string.Format(“*!!{0}!!!!*”,incomingData));
}
Show(stringToDebug.ToString(),“PCH字符串调试器可视化工具”,MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
}
}
公共类DRObjectSource:VisualizationRobjectSource
{
public override void GetData(对象目标、流输出数据)
{
如果(target!=null&&target为DataRow[])
{
DataRow[]行=目标为DataRow[];
BinaryFormatter formatter=新的BinaryFormatter();
//序列化(outgoingData,target);
Serialize(outgoingData,string.Format(“有{0}行数据”,rows.Length));
}
}
}
}
正如我希望您可以看到的,我正在尝试正确设置目标,但是VS在运行时/调试时没有使用它。是的,我正在将DLL复制到正确的可视化工具目录。事实上,我正在使用BuildEvent来完成这项工作


xcopy "$(SolutionDir)$(ProjectName)\$(OutDir)$(TargetFileName)" "$(USERPROFILE)\Documents\Visual Studio 2010\Visualizers" /y
当我测试这个时,我使用这个


静态void Main(字符串[]参数)
{
//字符串myName=“彼得·亨利”;
#区域数据设置,创建一个Habs数据表并用播放器填充它
数据表=新数据表(“Habs”);
表.Columns.Add(“PlayerNumber”,typeof(Int32));
table.Columns.Add(“PlayerName”,typeof(string));
表.列.添加(“位置”,类型(字符串));
//2010年9月23日来自加拿大人的最新队伍!加油!
添加(新对象[]{32,“Travis Moen”,“F”});
添加(新对象[]{94,“Tom Pyatt”,“F”});
table.Rows.Add(新对象[]{75,“Hal Gill”,“D”});
table.Rows.Add(新对象[]{26,“Josh”、“D”});
table.Rows.Add(新对象[]{76,“P.K.子组”,“D”});
table.Rows.Add(新对象[]{35,“Alex Auld”,“G”});
#端区
//使用此选项以两种不同的方式显示调试器
DataRow[]defencemen=table.Select(“Position='D'”,“PlayerNumber”);
//当被告知要使用哪个ObjectSource时,这证明了这一点
VisualizerDevelopmentHost=新VisualizerDevelopmentHost(
防御人,类型(PCHenry.DR),
类型(PCHenry.DRObjectSource));
host.ShowVisualizer();
//但是当我尝试在这里使用VS调试时,它似乎无法像我所期望的那样找到定制的DebuggerVisualizer
defencemen=table.Select(“Position='D',“PlayerNumber”);
Debugger.Break();
控制台写入线(“FIN”);
Console.ReadLine();
}
这里的关键是,VisualizerDevelopmentHost工作正常,我只能猜测原因,因为它被告知要使用哪个VisualizerObjectSource。但是当我点击调试器时。Break();我看不到国防部数据行[]的放大镜

我从心底相信这是可以做到的。我在MSDN DataRow上读到了无法完成的内容,但我让它工作了。我真的希望你能帮我把这件事做好


非常感谢你们的回复。你证实了我的想法(好吧,经过四个晚上的斗争我终于意识到了!)。再次感谢。我在博客上提到了这个信息。非常感谢您抽出时间


调试可视化工具不适用于阵列

您可以为其编写自定义可视化工具 任何托管类的对象,除了 用于对象或数组。

可视化类型必须具有属性[Serializable]或实现ISerializable。 数组不实现ISerializable,因此无法对其进行属性化。出于某种原因


不过,列表是有效的,所以我有时会创建一个新的列表,只是为了调试。

在大多数情况下,Spike所说的是正确的。您可以为任何“对象或数组除外”编写可视化工具:

“数组”似乎有点模棱两可;但是有很多人有同样的问题

我还没有找到任何与此相关的东西(也没有尝试过),但是,IEnumerable呢?这样行吗


还有一篇有趣的文章,介绍了可视化工具可以绕过的对象类型限制,除了这里:

这是一个有趣的技巧。我从来没有想过尝试在手表窗口中创建一个对象。因此,您可以为列表编写可视化工具,在“监视”窗口中,您可以观看“新列表(yourDataRowArray)”,并将其可视化,而无需更改代码。那很整洁。此外,我还模糊地记得,几年前,当我试图为double[]编写可视化工具时,我尝试了IEnumerable,但一无所获。这是有道理的,因为可视化工具处理对象,而接口不是对象。我刚试过鱼f=新鱼();IFish if=f;一个瞄准鱼的可视化工具对f和if有效,但一个瞄准IFish的可视化工具对两者都无效。