bla*_*238 9 com arcobjects com-interop visual-studio-2010 linqpad
在这个相关的问题中,我注意到Visual Studio的调试器能够枚举System.__ComObject引用的属性,这是"当包装器类型不明确时使用的隐藏类型" - 例如,当您从另一个获取它时获得的对象类型COM对象,不要自己实例化它:

此外,如果您只是将COM对象的标识符写入立即窗口,其属性和值将被类似地转储:

请注意,这与VS2010的" 动态视图 " 是分开的,我认为它使用IDispatchCOM反射来枚举COM对象的属性,而不使用PIA和.NET反射.我正在使用的对象没有实现IDispatch(也没有实现IProvideClassInfo),因此,"动态视图"无法获取有关它们的任何信息:

有趣的是,SharpDevelop的调试器无法列出System.__Comobjects(例如point.Envelope)的成员,只能列出强类型的RCW(例如point).

那么Visual Studio如何才能做到呢?
我相信在这种情况下,这是因为主互操作程序集存在这些对象支持的接口的定义,并且Visual Studio可能使用反射来枚举支持的接口和属性.那是准确的吗?如果是这样,它是如何工作的?
对于初学者,它如何访问PIA?它只查看当前加载的PIA还是动态加载它们(如果是,如何)?它如何确定哪个界面可以有多个枚举属性?它似乎只使用一个,而不一定是第一个.从我正在使用的API(ArcObjects)的文档中,这些对象的默认接口是IUnknown,所以它不仅仅使用默认接口.
在屏幕截图的示例中,它枚举成员的IEnvelope接口是接口,它继承自IGeometry接口.VS2010如何知道不会枚举成员IGeometry,在我的测试中,如果你只是枚举PIA中的所有接口类型,它首先出现?一些非常聪明的事情或者我错过了一些明显的东西?
我问的原因是LINQPad 的开发人员似乎愿意实现相同的功能,如果他知道VS如何做到这一点.所以这里一个好的答案可以帮助改进这个非常受欢迎的工具.
操作方法如下:
IDispatch(替代可能的路径是IDispatchEx)IDispatch::GetTypeInfo其他增强功能适用:查询IPersist*接口系列或IProvideClassInfo获取对象类型库的引用并发现属性。