我正在编写自己的调试器可视化工具。所有这些都很好地展示了数据的可视化工具。
现在我添加代码以便更清晰:
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/