如何使用自己的调试器可视化工具在运行时编辑变量?

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


        }

    }
}

这里的字符串被传递到可视化工具中并显示我的自定义表单。它有效。 但现在我想将修改后的数据从表单传回变量。

我该怎么做?

编辑:

我发现我需要重写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);
        }

    }

这个问题中没有足够的信息供任何人提供答案。 - John Koerner
我已经纠正了术语并改进了标题,但是您确实没有提供足够的信息供任何人能够可靠地回答这个问题,除非使用通用方法。您有一些已尝试的代码吗? 有进行任何研究吗? - J. Steen
是的,抱歉。我现在添加了代码。我没有找到任何关于如何做到这一点的信息.. :| - CodeTherapist
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


谢谢你的回答。但不,这不是我想做的。你的代码只从表单中获取修改后的数据,但没有将值传回运行时变量...请看我的编辑过的帖子。 - CodeTherapist
1
请注意,如果您在悬赏过期之前没有授予悬赏,您仍将失去声望,但没有人会获得它! - Sam Shiles
不是针对这个具体的例子,但我之前使用过相同的技术。为什么,你还在遇到问题吗?告诉我它们是什么,我会尽力帮忙!:) 此外,我已经编辑了代码,使其更加“适合生产”,因为昨晚我用我的iPhone编写C#代码并不是最容易的工具! - Sam Shiles
另外,请注意,我的原始代码中存在一个疏忽,使用了字符串“myData”,现在已更改为使用实际变量。 - Sam Shiles
我会尽快发布一个可工作的示例,可能需要等到我有时间的时候 :) - Sam Shiles
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接