4

私は自分のデバッガービジュアライザーを書いています。すべてがうまく機能し、データとともにビジュアライザーに表示されます。

ここで、より明確にするためにコードを追加します。

public class MyVisualiserObjectSource : VisualizerObjectSource
{
    public override void GetData(object target, Stream outgoingData)
    {
        string data= target as string;
        var writer = new StreamWriter(outgoingData);
        writer.Write(data);
        writer.Flush();
    }    
}

public class MyVirtualizer : DialogDebuggerVisualizer
{
    protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        var streamReader = new StreamReader(objectProvider.GetData());

        string data = streamReader.ReadToEnd();

        using (var form = new MyVirtualizerForm(data))
        {
            windowService.ShowDialog(form);


        }

    }
}

ここの文字列はビジュアライザーに渡され、独自のフォームが表示されます。できます。しかし今、変更されたデータをフォームから変数に戻したいと思います。

それ、どうやったら出来るの?

編集:

TransferDataのメソッドをオーバーライドする必要があることがわかりましたVisualizerObjectSource。しかし、MSDNには、これを正しく実装する方法に関する詳細情報はありません。

誰か助けてくれませんか?

編集2:

私はIL-SpyでTransferDataメソッドが何をするのかを見ました。例外がスローされます。だから私はメソッドをオーバーライドします。しかし、それはまだ機能していません。はincomingData、 から変更された文字列Formです。しかし、私はこの値を変数に戻しません:(

public class StringVisualiserObjectSource : VisualizerObjectSource
    {
        public override void GetData(object target, Stream outgoingData)
        {
            var data = target as string;
            var writer = new StreamWriter(outgoingData);
            writer.Write(data);
            writer.Flush();

        }

        public override void TransferData(object target, Stream incomingData, Stream outgoingData)
        {
            incomingData.CopyTo(outgoingData);
        }

    }
4

1 に答える 1

0

「戻したい」データを含むパブリック プロパティをフォームに追加するだけです。たとえば、フォームに MyDataTextBox というテキスト ボックスが含まれている場合、次のようなパブリック プロパティをフォームに作成する必要があります。

public MyVirtualizerForm : System.Windows.Form
{
    public string MyData
    {
     get{ return MyDataTextBox.Text;}
    }
}

次のようにして、フォームが閉じられたときにテキストボックスのテキストにアクセスできます。

編集済み - データを変数に戻す

これは、フォームから返されるデータが文字列であることを前提としています。

  using (var form = new MyVirtualizerForm(data))
  {
            windowService.ShowDialog(form);
            var formData = form.MyData;

            using (MemoryStream returnStream = 
               new MemoryStream(ASCIIEncoding.Default.GetBytes(formData)))
            {
               objectProvider.TransferData(returnStream);
            }
   }

これはあなたが達成したいことですか?また、次のリンクが参照として役立つ場合があります: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.debuggervisualizers.ivisualizerobjectprovider.transferdata.aspx

于 2012-11-20T21:51:14.347 に答える