0

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

通过查看文档,听起来 an IDebugExpressionContext2会更有用。有了其中一个,我似乎可以从表达式中获得更多信息——关于类型和任何成员的详细信息等等,而无需将所有内容都作为字符串传递。

不过,我找不到任何实际获得 a 的方法IDebugExpressionContext2IDebugProgramProvider2看起来有点相关,因为我可以开始,IDebugProgramProvider2::GetProviderProcessData然后慢慢向下钻取,直到找到可以提供我的表达式上下文的东西——但我需要为此提供一个端口,并且不清楚如何检索对应于的端口当前的调试会话。(即使我尝试了每个端口,也不清楚如何判断哪个端口是正确的......)

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

有人可以帮忙吗?

4

2 回答 2

1

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

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

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

于 2010-02-02T23:03:42.247 回答
0

您可以采取一些技巧来获取有关您使用 Debugger::GetExpression 方法评估的变量类型的更多信息。

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

然后,运行以下命令:

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

一旦你有了 TypeFullName,你就可以在你的程序集缓存中搜索匹配的 System.Type,一旦你有了它,你就可以使用标准的反射 API 来挖掘它。

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

于 2010-05-31T08:10:23.723 回答