Using CCW, it's easy to expose a .NET object to the unmanaged world.
This article goes a step further and does it the "manual" way, registering the Class Factory inside a C# windows service.
In the class factory, he creates a .NET object and hands back a COM usable pointer by using
Marshal.GetComInterfaceForObject
.