Writing a .NET type and consuming that type from unmanaged code are distinct activities for developers. Following links describe several tips for writing managed code that interoperates with COM clients:
To develope a managed type for COM Qualifying .NET types for interoperation. All managed types, methods, properties, fields, and events that you want to expose to COM must be public. Types must have a public default constructor, which is the only constructor that can be invoked through COM.
Additionally, following links identify the tasks related to consuming a managed type from a COM client.
To consume a managed type from COM Register assemblies with COM. Types in an assembly (and type libraries) must be registered at design time. If an installer does not register the assembly, instruct COM developers to use Regasm.exe.
Reference .NET types from COM. COM developers can reference types in an assembly using the same tools and techniques they use to refer other COM types.
Call a .NET object. COM developers can call methods on the .NET object the same way they call methods on any unmanaged type.
Deploy an application for COM access. A strong-named assembly can be installed in the global assembly cache and requires a signature from its publisher. Assemblies that are not strong named must be installed in the application directory of the client.