使用Visual Studio 2005 SDK而不是自动化的Debugger :: GetExpression评估表达式

时间:2010-02-02 22:38:33

标签: visual-studio debugging visual-studio-2005 vsx

我正在考虑为Visual Studio 2005编写一个需要监视窗口类型功能的插件(或包,如果需要) - 表达式的评估和类型的检查。自动化设施提供 Debugger::GetExpression,这是有用的,但信息 提供的有点粗糙。

从浏览文档来看,它听起来像是一个 IDebugExpressionContext2会更有用。其中之一就是它 看起来好像我可以从表达式中获取更多信息 - 详细 关于类型和任何成员等的信息,等等,没有一切都以字符串形式出现。

我找不到任何实际获得IDebugExpressionContext2的方式, 虽然!我IDebugProgramProvider2看起来很相似 可以从IDebugProgramProvider2::GetProviderProcessData开始 然后慢慢向下钻,直到达到能够供给我的东西 表达式上下文 - 但我需要为此提供一个端口,而且它是 不清楚如何检索当前调试对应的端口 会话。 (即使我尝试了每个端口,但是如何判断并不明显 哪个端口是正确的...)

我开始怀疑这不是一个支持的用例,但运气好的话我只是错过了一些非常明显的东西。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

使用IDebugExpressionContext,您最终将获得IDebugProperty的实例。此接口由Expression Evaluator服务实现。这通常是特定于语言的服务。它旨在抽象出评估表达式的语言特定细节。它理解更高级别的命令,如“评估”和检查。

我不认为你会得到你想要的东西,因为你不能以这种方式得到任何类型的物体。几乎所有检查方法都以String形式返回结果。例如,您不会获得类型Int32,而是字符串“int”。这使得类型检查几乎不可能。

我不相信你所尝试的是支持的案例。正在评估的类型系统在当前进程中不存在。它存在于调试对象进程中,并且很难访问。

答案 1 :(得分:0)

您可以使用Debugger :: GetExpression方法获取有关已评估变量类型的更多信息。

您可以评估“AppDomain.CurrentDomain.GetAssemblies()”以将所有程序集加载到debugee中,并将它们缓存在您的加载项中。您可能还需要侦听加载到AppDomain上的新程序集。

然后,运行以下命令:

Expression myExpression = Debugger.GetExpression(...);
Expression typeRefExpression = Debugger.GetExpression("typeof(" + myExpression.Type + ").FullName"

一旦你有了TypeFullName,你就可以在你的程序集缓存中搜索匹配的System.Type,一旦你有了,你可以使用标准的Reflection API深入研究它。

请注意,这仅适用于C#,因为它的“typeof”关键字。例如,你必须为VB.Net使用不同的关键字。