MSDN Magazine - January 2009 - (Page 22) Unmanaged sapi.dll SpVoice ( COM Object ) Managed mscorlib.dll RCW System ComObject ConsoleApplication1.exe .NET Client given you a reference to the RCW, and .NET will take care of releasing it for you. But if the method gives you back an IntPtr, it means you have a reference to the COM object itself, and you almost always have to call Marshal.Release on it (this depends on the precise semantics of whatever method gave you that IntPtr). Here’s how: Dim com As IntPtr = Dim rcw = Marshal.GetObjectForIUnknown(com) Marshal.Release(com) TypeLibrary: ITypeInfo Figure 2 Getting a Runtime Callable Wrapper But it is far more common to declare the function with marshaling so that the marshaler calls GetObjectForI Unknown and Release automatically, as in the declaration of CoCreateInstance that you see in Figure 3. When a Type Lacks an RCW What happens if you don’t have an interop assembly for a COM object? For example, what if you created the COM object itself via CoCreateInstance, or if, as often happens, you call a method on a COM object and it returns a COM object whose type isn’t known in advance? What if you’ve written a managed plugin for an un managed application, and the application gave you a COM object? What if you discovered which COM object to create by looking through the registry? Using ITypeInfo A nice trick for understanding how an object works is to inspect it using reflection. Every one of these things will give you an IntPtr reference to the COM object rather than an Object reference to its RCW. When you ask for an RCW around that IntPtr, you get what is illustrated in Figure 2. In Figure 2 you’ll see that the CLR provided a default RCW, an instance of the default interop type “System ComObject”. If you reflect on this like so Dim b = CoCreateInstance(CLSID_WebBrowser, _ Nothing, 1, IID_IUnknown) Console.WriteLine("DUMP {0}", b.GetType()) For Each member In b.GetType().GetMembers() Console.WriteLine(member) Next ITypeInfo is the equivalent of System.Type for COM classes and interfaces. With it you can enumerate the members of a class or interface. In this example, I’m going to print them out; howev er, you could use ITypeInfo to look up members at run time and then invoke them or get their property values through IDispatch. Figure 4 shows how ITypeInfo fits in, as well as all the other struc tures you’ll need to use. The first step is getting the ITypeInfo for a given COM ob ject. It would be nice if you could use rcw.GetType(), but alas this returns the System.Type information about the RCW it self. It would also be nice if you could use the builtin function Marshal.GetITypeInfoForType(rcw), but unfortunately this only works for RCWs that come from interop assemblies. Instead, you will have to get the ITypeInfo manually. The following code will work for both of these cases, whether the RCW came from the stub in mscorlib, or from a proper in terop assembly: Dim idisp = CType(rcw, IDispatch) Dim count As UInteger = 0 idisp.GetTypeInfoCount(count) If count < 1 Then Throw New Exception("No type info") Dim _typeinfo As IntPtr idisp.GetTypeInfo(0, 0, _typeinfo) If _typeinfo = IntPtr.Zero Then Throw New Exception("No ITypeInfo") Dim typeInfo = CType(Marshal.GetTypedObjectForIUnknown(_typeinfo, _ GetType(ComTypes.ITypeInfo)), ComTypes.ITypeInfo) Marshal.Release(_typeinfo) This code uses the interface IDispatch. The interface isn’t defined Figure 3 CoCreateInstance _ Function CoCreateInstance( _ ByRef clsid As Guid, _ ByVal punkOuter As Object, _ ByVal context As Integer, _ ByRef iid As Guid) _ As Object End Function Dim IID_NULL As Guid = New Guid("00000000-0000-0000-C000-000000000000") Dim IID_IUnknown As Guid = New _ Guid("00000000-0000-0000-C000-000000000046") Dim CLSID_SpVoice As Guid = New _ Guid("96749377-3391-11D2-9EE3-00C04F797396") Dim b As Object = CoCreateInstance(CLSID_SpVoice, Nothing, 1, _ IID_IUnknown) you’ll find that it doesn’t have any members that are useful to you; it only has these: DUMP System ComObject System.Object GetLifetimeService() System.Object InitializeLifetimeService() System.Runtime.Remoting.ObjRef CreateObjRef(System.Type) System.String ToString() Boolean Equals(System.Object) Int32 GetHashCode() System.Type GetType() To get useful reflection on such a COM object, you have to reflect on its TypeLibrary yourself. You can do so using ITypeInfo. But first, a brief note: if a method gives you back an Object or IDispatch or ITypeInfo or other .NET class or interface, then it has 22 msdn magazine Basic instincts
Table of Contents Feed for the Digital Edition of MSDN Magazine - January 2009 Toolbox CLR Inside Out Basic Instincts Cutting Edge Test Run First Look Geneva Framework Silverlight Windows Mobile Service Station Security Briefs Extreme ASP.NET Foundations .NET Matters { End Bracket } MSDN Magazine - January 2009 MSDN Magazine - January 2009 - (Page Intro) MSDN Magazine - January 2009 - (Page Cover1) MSDN Magazine - January 2009 - (Page Cover2) MSDN Magazine - January 2009 - (Page 1) MSDN Magazine - January 2009 - (Page 2) MSDN Magazine - January 2009 - (Page 3) MSDN Magazine - January 2009 - (Page 4) MSDN Magazine - January 2009 - (Page 5) MSDN Magazine - January 2009 - (Page 6) MSDN Magazine - January 2009 - (Page 7) MSDN Magazine - January 2009 - (Page 8) MSDN Magazine - January 2009 - Toolbox (Page 9) MSDN Magazine - January 2009 - Toolbox (Page 10) MSDN Magazine - January 2009 - Toolbox (Page 11) MSDN Magazine - January 2009 - Toolbox (Page 12) MSDN Magazine - January 2009 - Toolbox (Page 13) MSDN Magazine - January 2009 - Toolbox (Page 14) MSDN Magazine - January 2009 - CLR Inside Out (Page 15) MSDN Magazine - January 2009 - CLR Inside Out (Page 16) MSDN Magazine - January 2009 - CLR Inside Out (Page 17) MSDN Magazine - January 2009 - CLR Inside Out (Page 18) MSDN Magazine - January 2009 - CLR Inside Out (Page 19) MSDN Magazine - January 2009 - CLR Inside Out (Page 20) MSDN Magazine - January 2009 - Basic Instincts (Page 21) MSDN Magazine - January 2009 - Basic Instincts (Page 22) MSDN Magazine - January 2009 - Basic Instincts (Page 23) MSDN Magazine - January 2009 - Basic Instincts (Page 24) MSDN Magazine - January 2009 - Basic Instincts (Page 25) MSDN Magazine - January 2009 - Basic Instincts (Page 26) MSDN Magazine - January 2009 - Basic Instincts (Page 27) MSDN Magazine - January 2009 - Basic Instincts (Page 28) MSDN Magazine - January 2009 - Basic Instincts (Page 29) MSDN Magazine - January 2009 - Basic Instincts (Page 30) MSDN Magazine - January 2009 - Cutting Edge (Page 31) MSDN Magazine - January 2009 - Cutting Edge (Page 32) MSDN Magazine - January 2009 - Cutting Edge (Page 33) MSDN Magazine - January 2009 - Cutting Edge (Page 34) MSDN Magazine - January 2009 - Cutting Edge (Page 35) MSDN Magazine - January 2009 - Cutting Edge (Page 36) MSDN Magazine - January 2009 - Cutting Edge (Page 37) MSDN Magazine - January 2009 - Cutting Edge (Page 38) MSDN Magazine - January 2009 - Test Run (Page 39) MSDN Magazine - January 2009 - Test Run (Page 40) MSDN Magazine - January 2009 - Test Run (Page 41) MSDN Magazine - January 2009 - Test Run (Page 42) MSDN Magazine - January 2009 - Test Run (Page 43) MSDN Magazine - January 2009 - Test Run (Page 44) MSDN Magazine - January 2009 - Test Run (Page 45) MSDN Magazine - January 2009 - Test Run (Page 46) MSDN Magazine - January 2009 - Test Run (Page 47) MSDN Magazine - January 2009 - Test Run (Page 48) MSDN Magazine - January 2009 - Test Run (Page 49) MSDN Magazine - January 2009 - First Look (Page 50) MSDN Magazine - January 2009 - First Look (Page 51) MSDN Magazine - January 2009 - First Look (Page 52) MSDN Magazine - January 2009 - First Look (Page 53) MSDN Magazine - January 2009 - First Look (Page 54) MSDN Magazine - January 2009 - First Look (Page 55) MSDN Magazine - January 2009 - First Look (Page 56) MSDN Magazine - January 2009 - First Look (Page 57) MSDN Magazine - January 2009 - First Look (Page 58) MSDN Magazine - January 2009 - First Look (Page 59) MSDN Magazine - January 2009 - First Look (Page 60) MSDN Magazine - January 2009 - First Look (Page 61) MSDN Magazine - January 2009 - First Look (Page 62) MSDN Magazine - January 2009 - First Look (Page 63) MSDN Magazine - January 2009 - Geneva Framework (Page 64) MSDN Magazine - January 2009 - Geneva Framework (Page 65) MSDN Magazine - January 2009 - Geneva Framework (Page 66) MSDN Magazine - January 2009 - Geneva Framework (Page 67) MSDN Magazine - January 2009 - Geneva Framework (Page 68) MSDN Magazine - January 2009 - Geneva Framework (Page 69) MSDN Magazine - January 2009 - Geneva Framework (Page 70) MSDN Magazine - January 2009 - Geneva Framework (Page 71) MSDN Magazine - January 2009 - Geneva Framework (Page 72) MSDN Magazine - January 2009 - Geneva Framework (Page 73) MSDN Magazine - January 2009 - Geneva Framework (Page 74) MSDN Magazine - January 2009 - Silverlight (Page 75) MSDN Magazine - January 2009 - Silverlight (Page 76) MSDN Magazine - January 2009 - Silverlight (Page 77) MSDN Magazine - January 2009 - Silverlight (Page 78) MSDN Magazine - January 2009 - Silverlight (Page 79) MSDN Magazine - January 2009 - Silverlight (Page 80) MSDN Magazine - January 2009 - Silverlight (Page 81) MSDN Magazine - January 2009 - Silverlight (Page 82) MSDN Magazine - January 2009 - Silverlight (Page 83) MSDN Magazine - January 2009 - Silverlight (Page 84) MSDN Magazine - January 2009 - Silverlight (Page 85) MSDN Magazine - January 2009 - Silverlight (Page 86) MSDN Magazine - January 2009 - Silverlight (Page 87) MSDN Magazine - January 2009 - Windows Mobile (Page 88) MSDN Magazine - January 2009 - Windows Mobile (Page 89) MSDN Magazine - January 2009 - Windows Mobile (Page 90) MSDN Magazine - January 2009 - Windows Mobile (Page 91) MSDN Magazine - January 2009 - Windows Mobile (Page 92) MSDN Magazine - January 2009 - Service Station (Page 93) MSDN Magazine - January 2009 - Service Station (Page 94) MSDN Magazine - January 2009 - Service Station (Page 95) MSDN Magazine - January 2009 - Service Station (Page 96) MSDN Magazine - January 2009 - Service Station (Page 97) MSDN Magazine - January 2009 - Service Station (Page 98) MSDN Magazine - January 2009 - Security Briefs (Page 99) MSDN Magazine - January 2009 - Security Briefs (Page 100) MSDN Magazine - January 2009 - Security Briefs (Page 101) MSDN Magazine - January 2009 - Security Briefs (Page 102) MSDN Magazine - January 2009 - Extreme ASP.NET (Page 103) MSDN Magazine - January 2009 - Extreme ASP.NET (Page 104) MSDN Magazine - January 2009 - Extreme ASP.NET (Page 105) MSDN Magazine - January 2009 - Extreme ASP.NET (Page 106) MSDN Magazine - January 2009 - Extreme ASP.NET (Page 107) MSDN Magazine - January 2009 - Extreme ASP.NET (Page 108) MSDN Magazine - January 2009 - Foundations (Page 109) MSDN Magazine - January 2009 - Foundations (Page 110) MSDN Magazine - January 2009 - Foundations (Page 111) MSDN Magazine - January 2009 - Foundations (Page 112) MSDN Magazine - January 2009 - Foundations (Page 113) MSDN Magazine - January 2009 - Foundations (Page 114) MSDN Magazine - January 2009 - Foundations (Page 115) MSDN Magazine - January 2009 - .NET Matters (Page 116) MSDN Magazine - January 2009 - .NET Matters (Page 117) MSDN Magazine - January 2009 - .NET Matters (Page 118) MSDN Magazine - January 2009 - .NET Matters (Page 119) MSDN Magazine - January 2009 - { End Bracket } (Page 120) MSDN Magazine - January 2009 - { End Bracket } (Page Cover3) MSDN Magazine - January 2009 - { End Bracket } (Page Cover4)
For optimal viewing of this digital publication, please enable JavaScript and then refresh the page. If you would like to try to load the digital publication without using Flash Player detection, please click here.