January 16th, 2006

Guidelines for COM Interoperability from .NET (Update 1)

Heath Stewart
Principal Software Engineer

Sometime back I posted Guidelines for COM Interoperability from .NET where I enumerated several practices to follow when exposing types from your managed assemblies to COM. This update is to provide some additional information with the release of the Microsoft .NET Framework 2.0 as well as correct one statement I made with regard to inheritting interfaces when those interfaces are exposed either as automation interfaces (inheriting from IDispatch) or dual interfaces (inheriting both from IUnknown and IDispatch).

Previously I mentioned that you should declare class interfaces explicitly and implement them as the first interface on your class attributed with the ClassInterfaceAttribute with the value of ClassInterfaceType.None. In the .NET Framework 2.0 a new attribute was added to explicitly declare which interface is the default interface for the class since in some cases the provided compilers will generate interfaces in a different order and third-party compilers may not even honor the order in the first place. The ComDefaultInterfaceAttribute class should be declared for your implementation class and you should specify the type of the class interface. The class must still implement this interface. This is also necessary since the interface will always inherit from either IUnknown or IDispatch depending on the value you use for the InterfaceTypeAttribute attributed on the interface. See Inheritance, Aggregation, and Containment in the .NET Framework SDK for more information.

I also mentioned that you should implement new versions of interfaces that inherit from older interfaces. When exposing your interfaces with ComInterfaceType.InterfaceIsIDispatch or ComInterfaceType.InterfaceIsDual you should actually re-declare all previous members since many automation clients like Windows Script can only work with a single default dispatch interface. You should still implement the older versions of the interfaces but as explicit interface implementations.

Also note that there is a new namespace that you should use if you can base your development and deployment with .NET 2.0 as the minimal requirement. The System.Runtime.InteropServices.ComTypes namespace declares many interfaces commonly implemented by COM servers and used by COM clients. The interfaces in System.Runtime.InteropServices that begin with UCOMI* are obsolete and may be removed in future versions as well.

Author

Heath Stewart
Principal Software Engineer

Heath is an application architect and developer, looking to help educate others to learn professional development. Besides designing and developing applications he enjoys writing about intermediate and advanced topics. Heath also consults for deployment packages and scenarios within Microsoft and for external customers.

0 comments

Discussion are closed.