Here is a solution based on info from MSDN and other sources:
Test class:
========
Imports System.Runtime.InteropServices
<ComClass(TestClass1.ClassId, TestClass1.InterfaceId, TestClass1.EventsId)> _
Public Class TestClass1
#Region "COM GUIDs"
Public Const ClassId As String = "FA16F4E8-69AC-4fd1-84BA-770674DFFFAE"
Public Const InterfaceId As String = "A041238E-7C8A-437d-A18B-3A18D09E7B60"
Public Const EventsId As String = "691E110D-C2FD-4eda-8801-A5246169A4F3"
#End Region
Public Sub New()
MyBase.New()
End Sub
<DispId(1)> Public Sub MessageBox(ByVal vstrMsg As String)
MsgBox("Message from VB.Net component - " & vstrMsg)
End Sub
<DispId(2)> Public Function GiveMeYourName() As String
GiveMeYourName = MyName()
End Function
<ComVisible(False), DispId(3)> Public Function MyName() As String
MyName = Me.GetType().FullName
End Function
<ComRegisterFunction()> Public Shared Sub OnRegistration(ByVal T As Type)
MsgBox(T.FullName & " is being registered in COM!")
End Sub
End Class
AssemblyInfo.VB
============
Imports System.Reflection
Imports System.Runtime.InteropServices
<Assembly: AssemblyTitle("CCW Test")>
<Assembly: AssemblyDescription("Call VB.NET Component from COM")>
<Assembly: AssemblyCompany("Test")>
<Assembly: AssemblyProduct("CCW Test DLL")>
<Assembly: AssemblyCopyright("Public Domain")>
<Assembly: AssemblyTrademark("")>
<Assembly: CLSCompliant(True)>
<Assembly: Guid("DB955828-2239-4747-A08C-5C1F9F574AFA")>
<Assembly: AssemblyVersion("1.0.*")>
<Assembly: ComVisible(True)>
<Assembly: ClassInterface(ClassInterfaceType.AutoDual)>
<Assembly: AssemblyKeyFileAttribute("<type you full path to snk file here>.snk")>
Create Assembly Strong Name .snk file
===========================
sn -k myKey.snk
Create class library and build solution from VS.NET IDE
======================================
(use of VS.NET IDE is obvious)
Register assembly and export type library
==============================
regasm MyCCWDll.dll /tlb:MyCCWDll.tlb
Install Assembly in the global Assembly cashe
================================
gacutil /if MyCCWDll.dll
Now you can set reference from COM applications to MyCCWDll.tlb and use its exposed objects via early binding or you can use CreateObject(...) to create instances of the objects exposed from MyCCWDll.dll and use them with late binding...
Maybe this above isnt an optimal way to make CCW Dll but it worked for me...
HTH,
Shamil
P.S. The procedure to make CCW components visible to COM should work automagically in theory fro VS.NET IDE if you set "Register for COM interop" checkbox in projects configuration settings but it failed for me...