c# - 如何使用我自己的调试器可视化工具来编辑运行时变量?

标签 c# debuggervisualizer

我正在编写自己的调试器可视化工具。所有这些都很好地展示了数据的可视化工具。

现在我添加代码以便更清晰:

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);


        }

    }
}

这里的字符串被传递给可视化工具并显示我自己的表单。有用。 但是现在我想将修改后的数据从表单传回给变量。

我该怎么做?

编辑:

我发现我需要覆盖 VisualizerObjectSource 中的 TransferData 方法。但是在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);
        }

    }

最佳答案

您只需要向您的表单添加一个公共(public)属性,其中包含您希望“传回”的数据。例如,如果您的表单包含一个名为 MyDataTextBox 的文本框,您需要在您的表单上创建一个公共(public)属性,例如:

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

关于c# - 如何使用我自己的调试器可视化工具来编辑运行时变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430900/

相关文章:

c# - 将现有密码短语更改为不明显的难以猜测的短语

c# - 这种 await/async 的用法是否正确?

c# - ObservableCollection 可视化工具 - 这样的东西存在吗?

linq - 调试器可视化工具 [Visual Studio 2010] - System.Linq.Expressions.Expression - 不显示放大镜

c# - 有没有办法让 NHibernate 将字符串键视为不区分大小写?

c# - 从 Office Web 加载项访问 C# 库

c# - 调试器可视化工具和 "Type is not marked as serializable"

c++ - 在 Visual Studio Express 2012 中为 boost::posix_time::ptime 安装可视化工具

c# - 哪个类用于 "Text Visualizer"?

c# - CLR 检测到无效程序