See the question and my original answer on StackOverflow

.NET Framework, .NET Core 3, and .NET 5/6/+ can expose a COM object to the COM world. This world includes VB6 and everything that can do COM.

a) Create a .NET 5 "NetClassLibrary" Class Library project (using Visual Studio for example)

b) Add a NetComObject.cs file with the following code for example:

using System;
using System.Runtime.InteropServices;

namespace NetClassLibrary
    [Guid("cfb2ee8b-f2ec-447c-9f0d-ac19c9a6cc26")] // TODO: change this GUID
    public class NetComObject
        public string SayHello() => "Hello World from .NET " + RuntimeInformation.FrameworkDescription;

c) Modify the .csproj to set the EnableComHosting property to true and make sure you compile for x86 as VB6 is a 32-bit program (note if you use Excel's 64-bit VBA, not VB6, you must compile for 64-bit), like this for example:

<Project Sdk="Microsoft.NET.Sdk">


  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">


d) Compile, start an admin prompt and run this:

regsvr32 yourPathTo\NetClassLibrary.comhost.dll

enter image description here

e) Create a VB6 project, add this VB6 code:

Private Sub Form_Load()

    Dim obj As Object
    Set obj = CreateObject("new:{cfb2ee8b-f2ec-447c-9f0d-ac19c9a6cc26}") // TODO: use the same GUID!

    MsgBox obj.SayHello()

End Sub

f) Run

enter image description here

Note 1: you can use a ProgId attribute too, like COM object often do, you don't have to stick to Guids only...

Note 2: I've only used IDispatch ("Lazy Loading") interface for this demonstration but you can use IUnknown-derived interfaces ("Early Loading") and TLBs too. Unfortunately .NET 5 doesn't create the .TLB for you, you'll have to build it by yourself or create it with another tool and import it in .NET and/or in VB6.