0

背景

我正在用 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:看这个视频可以更好地解释这个问题

4

2 回答 2

0

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

同时,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),或者可以重现问题的示例项目?

于 2021-01-27T02:24:31.637 回答
0

我发现了问题所在:我没有UseAutoExpandRulesGetExpression. 现在我的代码按预期工作!

感谢@Mia Wu-MSFT,dte.Debugger.GetExpression("tempC", true, 1)她输入了她的代码并让我发现了这个UseAutoExpandRules论点

于 2021-03-17T13:17:03.200 回答