In the latest issue of MSDN Magazine, there is an article that deals with the exposure of .NET functionality to existing VB6 applications.

The articles covers the use of the new COM Class item template that comes with VS2005 to expose functionality found in the new VB.NET My namespace language feature. The interop wrapper concept is a great way to allow your applications (both legacy COM and .NET) interact with one another with ease.

Currently, at a client site, we're using the same wrapper concept to expose services (classes that inherit from System.EnterpriseServices.ServicedComponent) to VB6 clients. Although, a VB6 client can directly call a ServicedComponent object (this is due to the fact that a ServicedComponent is registered with COM in order to be in the COM+ catalog), using a wrapper makes things prettier for both sides.

Here's an example why this is a good application of an interop wrapper:

Say your ServicedComponent contains a method that returns a type that's not easily exposable to COM, a System.Collections.Generic.List<> instance for example. Using an interop wrapper as a broker between client and component can facilitate the marshalling of data by converting the returned List<> instance as a SafeArray that VB6 (or any other COM client) can understand. Doing so, your ServicedComponent class stays free of interop related code and .NET friendly. Another HUGE benefit of using an interop wrapper to call a ServicedComponent from COM client is that you can explicitly call the Dispose method for your component in the .NET side to assure that the object gets disposed properly.

[Note: Setting a ServicedComponent reference to Nothing in your VB6 code does not dispose of your object. You will have to explicitly cast your reference to IDisposable and then call Dispose.]

If you're currently in the process of migrating VB6 applications to .NET, I strongly recommend you read this article to get your mind thinking in the way.