如何Visual Studio中的调试器/交互式窗口转储COM对象的属性在.NET?(How doe

2019-08-16 20:40发布

在此相关的问题 ,我注意到,Visual Studio的调试器可以枚举的属性System.__ComObject引用,这是“使用的隐藏式时的包装类型不明确” -例如,对象的类型你当你获得它从另一个COM对象,不要自己实例吧:

此外,如果你只是写一个COM对象的标识符到即时窗口,它的属性和值同样倾倒:

请注意,这是从VS2010的“独立的动态视图 ”,我相信使用IDispatch和COM反射枚举COM对象的属性,而无需使用PIA的和.NET的反射。 我一起工作的对象没有实现IDispatch (它们也没有实现IProvideClassInfo为此事),正因为如此,“动态视图”是不能够获得任何有关他们的信息:

有趣的是, SharpDevelop的的调试器是不能够列出的会员System.__Comobject S(例如point.Envelope ),只有强类型的RCW(如point )。

因此,如何为Visual Studio中能够做到这一点?

我相信,在这种情况下,这是因为主Interop程序与这些对象支持的接口定义是否存在,和Visual Studio很可能使用反射来枚举所支持的接口和属性。 是准确的? 如果是这样,它是如何工作的?

对于初学者来说,它是如何访问PIA的? 它是否只能看当前加载PIA的还是它动态地加载它们(如果有的话,怎么样)? 它是如何确定哪些接口,其中可以有很多,枚举的属性? 它似乎只使用一个,而不一定是第一个。 从文档的API的我与(ArcObjects的)工作,这些对象的默认界面是IUnknown ,所以它不只是使用默认的界面无论是。

在屏幕截图的例子中,接口被枚举的成员是IEnvelope接口,其从继承IGeometry接口。 如何VS2010不知道枚举的成员IGeometry代替,这在我的测试中,第一次出现,如果你只是列举在PIA的所有接口类型? 一些非常聪明的事情或者也许我失去了一些东西明显?

我问的原因是开发商LINQPad 似乎愿意来实现相同的功能,如果他知道VS是如何做的。 所以这里一个很好的答案可能很长的方式来帮助改善这种非常受欢迎的工具。

Answer 1:

这是如何做到这一点:

  • 获得COM对象的IDispatch (可能的替代路径是IDispatchEx
  • 获得基准的类型库- IDispatch::GetTypeInfo
  • 负载类型库和枚举属性
  • 实时查询对象针对发现的属性值

其他增强oipions适用于:查询IPersist*系列接口或IProvideClassInfo交替地获得引用类型库的对象和发现的属性。



文章来源: How does Visual Studio's debugger/interactive window dump the properties of COM Objects in .NET?