我正在考虑为Visual Studio 2005编写一个需要监视窗口类型功能的插件(或包,如果需要) - 表达式的评估和类型的检查。自动化设施提供
Debugger::GetExpression
,这是有用的,但信息
提供的有点粗糙。
从浏览文档来看,它听起来像是一个
IDebugExpressionContext2
会更有用。其中之一就是它
看起来好像我可以从表达式中获取更多信息 - 详细
关于类型和任何成员等的信息,等等,没有一切都以字符串形式出现。
我找不到任何实际获得IDebugExpressionContext2
的方式,
虽然!我IDebugProgramProvider2
看起来很相似
可以从IDebugProgramProvider2::GetProviderProcessData
开始
然后慢慢向下钻,直到达到能够供给我的东西
表达式上下文 - 但我需要为此提供一个端口,而且它是
不清楚如何检索当前调试对应的端口
会话。 (即使我尝试了每个端口,但是如何判断并不明显
哪个端口是正确的...)
我开始怀疑这不是一个支持的用例,但运气好的话我只是错过了一些非常明显的东西。
有人可以帮忙吗?
答案 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使用不同的关键字。