Visual Basic:使用反射检查COM对象2010-01-04 MSDN Lucian Wischik内容类型库和运行时可调用包装当某个类型缺少 RCW 时使用 ITypeInfo找出类型引用获得成员基元类型和综合类型值的 COM 表示形式转储 COM 对象的属性使用 IDispatch.Invoke讨论很多人在尝试让 COM 发挥作用时都有点受挫的感觉 。当然在成功时,也会感到兴奋无比。在了解对象的工作原理时,经常需要费一番周折的是使用 Microsoft .NET Framework 的反射功能对其进行检查。在某些情况下,.NET 反射还会对 COM 对象起作 用。看看下面的代码您就会明白我的意思。此代码使用 .NET 反射来获取并显示该对象中的成员列表
Dim b As New SpeechLib.SpVoice
Console.WriteLine("GETTYPE {0}", b.GetType())
For Each member In b.GetType().GetMembers()
Console.WriteLine (member)
Next
并在控制台中产生以下输出:
GETTYPE SpeechLib.SpVoiceClass
Void Speak(System.String, UInt32, UInt32 ByRef)
Void SetVoice(SpeechLib.ISpObjectToken)
Void GetVoice(SpeechLib.ISpObjectToken ByRef)
Int32 Volume
...
但此代码并不是对所有 COM 对象都起作用。对有些对象,必须使 用 COM 反射。本专栏将为大家介绍其原因以及实现方式。为什么想要对某个对象使用反射?我 发现反射对于调试和记录非常有用;您可以使用它来编写通用“转储”例程,以输出关于某 个对象的所有内容。本专栏中的代码足以让您能够编写自己的“转储”例程。编写完成后, 您甚至可以在调试时从即时窗口中对其进行调用。由于 Visual Studio 调试器并不是始终都提供有关 COM 对象的足够多信息,因此这一点非常有用。对于生产使用,如果您编写的应用程序采用插件 组件,并且用户将其组件放置在某个目录中或将其列在注册表中,而您的应用程序必须检查这些组件并 找出它们所公开的类和方法,那么反射也非常有用。例如,Visual Studio 通过这种方式使用反射来填 充 IntelliSense。类型库和运行时可调用包装让我们构建一个项目以供说明之用。首先 ,创建项目并通过“Project”(项目)>“AddReference”(添加引用)命令 添加一个 COM 引用。在本专栏中,我将使用 "Microsoft Speech Object Library" SpeechLib。图 1 显示了在运行您先前看到的反射代码时需要检查的相关实体和文件。

图 1 关于 SpeechLib 的反射