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

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

背景

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

密码

要执行即时 Window 命令,我使用这行代码:

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

问题

当我手动 运行 Immediate Window 中的表达式时,returned 对象被转储,正如我在 Watch Window 中看到的那样(see here). I managed to find all the children names, but the values are missing (see here).

我想要的是实现DisplayString({ size=5 }),但是还没找到有用的东西

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

编辑:我不必使用这个 API。如果您知道另一种可以 return 这种刺痛的方法,请提出建议。一种想法是检索 Immediate Window (see the right side) 的完整输出字符串,然后对其进行解析。

EDIT2:See this video that better explains the issue

你使用向量变量来get/parse函数return值,这是合理的,因为return myFunc() 的结果恰好是一个向量类型,因此变量“ std::vector result”可以正确解析得到vector对象。 “手动 运行 即时 Window 中的表达式,returned 对象被转储,正如我在 Watch Window 中看到的那样”是什么意思?

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

因此,我们无法从此处的立即数 Window 中获取“{size=5}”应该是设计使然:

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

我发现了问题所在:我没有在 GetExpression 中传递 UseAutoExpandRules(默认为 false)。现在我的代码按预期工作了!

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