繁体   English   中英

如何从 Debugger.GetExpression 获取 DisplayString 字段?

[英]How can I get the DisplayString field from Debugger.GetExpression?

背景

我正在用 C# 编写一个 Visual Studio 扩展,它在调试另一个应用程序时在立即窗口中执行代码。 该表达式返回的值可以是 int、字符串文字、类等。我正在调试的应用程序是用 C++ 编写的。

编码

要执行即时窗口命令,我使用以下代码行:

var expression = dte.Debugger.GetExpression("funcname()");

并检索我使用的结果:

string val = expression.Value;

和:

var children = expression.DataMembers;

这是我正在调试的应用程序中的 myFunc():

std::vector<int> myFunc()
{
    return { 1, 2, 3, 4, 5 };
}

问题

当我在立即窗口中手动运行表达式时,返回的对象将被转储,就像我在监视窗口中看到的一样请参阅此处)。 我设法找到了所有孩子的名字,但缺少值(请参阅此处)。

我想要的是实现 DisplayString ( { size=5 } ),但我还没有发现任何有用的东西。

如何从 Debugger.GetExpression 获取 DisplayString 字段?

编辑:我不必使用此 API。 如果您知道可以返回此刺痛的另一种方法,请提出建议。 一种想法可能是检索立即窗口的完整输出字符串(见右侧),然后对其进行解析。

EDIT2:看这个视频,更好地解释了这个问题

你用vector变量来获取/解析函数返回值,这是合理的,因为myFunc()的返回结果正好是一个vector类型,因此变量std::vector result可以正确解析和获取vector对象。 “在立即窗口中手动运行表达式,返回的对象将被转储,就像我在观察窗口中看到的那样”是什么意思?

同时,EnvDTE.Expression.Value 是一个表示对象值的字符串。 它与显示字符串 '{size=5 }' 无关,它只是一个属性表达式。 您可以使用以下示例代码打印它:

public static void Value(DTE dte)  
{  
    // Setup debug Output window.  
    Window w = (Window)dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);  
    w.Visible = true;  
    OutputWindow ow = (OutputWindow)w.Object;  
    OutputWindowPane owp = ow.OutputWindowPanes.Add("Value property: ");  
    owp.Activate();  

    EnvDTE.Expression exp = dte.Debugger.GetExpression("tempC", true, 1);  
    owp.OutputString("\nThe name of the expression: " + exp.Name);  
    owp.OutputString("\nThe type of the expression: " + exp.Type);  
    owp.OutputString("\nThe value of the expression: " + exp.Value);  
}

因此,应该是设计使然,我们无法从此处的立即窗口中获取 '{size=5}':在此处输入图片说明

关于“在可视化文件(.natvis)中定义的显示字符串”,DisplayString应该是自定义的属性,您能否提供您的可视化文件(.natvis),或者可以重现问题的示例项目?

我发现了什么问题:我是不是经过UseAutoExpandRules (默认为false)在GetExpression 现在我的代码按预期工作!

感谢@Mia Wu-MSFT 将dte.Debugger.GetExpression("tempC", true, 1)放入她的代码中并让我发现了UseAutoExpandRules参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM