Я пытаюсь заставить DataRow [] DebuggerVisualizer работать на VisualStudio 2010, и, к сожалению, я не могу заставить его работать.Я могу заставить работать DataRow, но не DataRow [], мне бы это понравилось, пожалуйста?
Суть кода здесь.
[assembly: DebuggerVisualizer(
typeof( PCHenry.DR ),
typeof( PCHenry.DRObjectSource ),
Target = typeof( DataRow[] ),
Description = "DataRow Array Debugger Visualizer (or so if you see this then it's working YAHOO!)" )]
namespace PCHenry
{
public class DR : DialogDebuggerVisualizer
{
protected override void Show( IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider )
{
StringBuilder stringToDebug = new StringBuilder();
using( Stream dataStream = objectProvider.GetData() )
{
BinaryFormatter formatter = new BinaryFormatter();
string incomingData = formatter.Deserialize( dataStream ) as string;
stringToDebug.Append( string.Format( "*!!!!{0}!!!!*", incomingData ) );
}
MessageBox.Show( stringToDebug.ToString(), "PCH String Debugger Visualizer", MessageBoxButtons.OK, MessageBoxIcon.Asterisk );
}
}
public class DRObjectSource : VisualizerObjectSource
{
public override void GetData( object target, Stream outgoingData )
{
if( target != null && target is DataRow[] )
{
DataRow[] rows = target as DataRow[];
BinaryFormatter formatter = new BinaryFormatter();
//formatter.Serialize( outgoingData, target );
formatter.Serialize( outgoingData, string.Format( "There are {0} rows of data", rows.Length ) );
}
}
}
}
Как я надеюсь, выКак видите, я пытаюсь правильно установить цель, но она не используется VS во время выполнения / отладки.Да, я копирую библиотеки DLL в правильный каталог визуализаторов.Фактически, я использую BuildEvent, чтобы выполнить эту работу за меня.
xcopy "$(SolutionDir)$(ProjectName)\$(OutDir)$(TargetFileName)" "$(USERPROFILE)\Documents\Visual Studio 2010\Visualizers" /y
Когда я тестирую это, я использую это.
static void Main( string[] args )
{
//String myName = "Peter Henry";
#region DataSetup, create a Habs DataTable and populate it with players
DataTable table = new DataTable( "Habs" );
table.Columns.Add( "PlayerNumber", typeof( Int32 ) );
table.Columns.Add( "PlayerName", typeof( string ) );
table.Columns.Add( "Position", typeof( string ) );
//team as current as 09-23-2010 from the Canadiens! GO HABS GO!
table.Rows.Add( new object[] { 32, "Travis Moen", "F" } );
table.Rows.Add( new object[] { 94, "Tom Pyatt", "F" } );
table.Rows.Add( new object[] { 75, "Hal Gill", "D" } );
table.Rows.Add( new object[] { 26, "Josh Gorges", "D" } );
table.Rows.Add( new object[] { 76, "P.K. Subban", "D" } );
table.Rows.Add( new object[] { 35, "Alex Auld", "G" } );
#endregion
//use this to show the debugger in two different ways
DataRow[] defencemen = table.Select( "Position = 'D'", "PlayerNumber" );
//this proves this works when told which ObjectSource to use
VisualizerDevelopmentHost host = new VisualizerDevelopmentHost(
defencemen, typeof( PCHenry.DR ),
typeof( PCHenry.DRObjectSource ) );
host.ShowVisualizer();
//but when I try to use VS debugging here, it can't seem to find the custom DebuggerVisualizer as I would expect
defencemen = table.Select( "Position = 'D'", "PlayerNumber" );
Debugger.Break();
Console.WriteLine( "FIN" );
Console.ReadLine();
}
Ключ здесь, VisualizerDevelopmentHostработает правильно, и я могу только догадываться, потому что он сказал, какой VisualizerObjectSource использовать.Но когда я нажимаю на Debugger.Break ();и попытайтесь использовать его как обычно, я не вижу увеличительное стекло для защитников DataRow [].
Я верю, что в глубине души это можно сделать.Я прочитал на MSDN DataRow не может быть сделано, но я получил его на работу.Я действительно надеюсь, что вы поможете мне в этом.
Большое спасибо, ребята, за ваши ответы.Вы подтвердили то, что я думал (хорошо, что я собирался понять после четырех ночей борьбы с этим!).Еще раз спасибо.Я написал об этом в блоге и сослался на эту информацию.Большое спасибо за ваше время.
Визуализаторы отладчика Visual Studio (Take Three)