Попытка заставить визуализатор отладчика DataRow [] работать в Visual Studio 2010 - PullRequest
4 голосов
/ 28 сентября 2010

Я пытаюсь заставить 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)

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

По большей части то, что говорит Спайк, правда. Вы можете написать визуализатор для чего угодно "кроме объекта или массива": http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

«Массив» кажется немного двусмысленным; но есть много людей с такой же проблемой ...

Я не смог найти что-то конкретное для этого (и не пробовал), но как насчет IEnumerable? Это работает?

Есть также интересная статья о том, как обойти ограничения на типы объектов, которые может визуализатор, кроме здесь: http://joshsmithonwpf.wordpress.com/2008/01/20/the-rock-star-hack-of-2008/

1 голос
/ 28 сентября 2010

Отладочные визуализаторы не работают для массивов.

Вы можете написать собственный визуализатор для объекта любого управляемого класса, кроме Object или Array.http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

Визуализированный тип должен быть приписан [Serializable] или реализован ISerializable.Массивы не реализуют ISerializable и не могут быть приписаны.По какой-то причине.

Однако списки работают, поэтому я иногда создаю новый список <>, только для целей отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...