How to correctly create COM classes with .NET8?
12:40 10 Apr 2024

I need to create a COM class in .NET8 that needs to be accessible to Excel.

After watching this video, I implemented the following test bed class:

namespace COMTestBedCS
{
    [Guid("26a0aa6d-5aba-458f-92b4-b9a30ae0c65c")]
    [GeneratedComInterface]
    public partial interface ITestBed
    {
        int GetXPTO();
        void SetXPTO(int value);
    }

    [Guid("3e178f98-522e-4e95-8a9c-6d80dc48b7d5")]
    [GeneratedComClass]
    public partial class TestBed : ITestBed
    {
        private int _XPTO = 1024;

        public int GetXPTO() => _XPTO;
        public void SetXPTO(int value)=>_XPTO = value;
    }
}

The project compiles correctly, without errors. However, when I try to reference this test bed in Excel, I get the following error: Can't add a reference to the specified file.

If I try to use regsvr32, I get the following error:

regsvr32 error message

What am I doing wrong?


For completion sake, here's the project file:



  
    net8.0
    enable
    enable
    true
  



Update

I was able to compile the code correctly and register it using regsvr32. However, I'm still unable to reference it in Excel.

First, I can't find it on the reference list. If I try to browse for the dll (either the assembly or the comhost), it fails with the message: Can't add a reference to the specified file.

All that's left now it to add it as a Reference in the Excel VBA.

New Code

Project



  
    COMTestBedCS
    net8.0-windows
    enable
    enable
    False
    true
    True
    x86
    x86
  


Code

using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;

namespace COMTestBedCS
{
    [Guid("26a0aa6d-5aba-458f-92b4-b9a30ae0c65c")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface ITestBed
    {
        int GetXPTO();
        void SetXPTO(int value);
    }

    [Guid("3e178f98-522e-4e95-8a9c-6d80dc48b7d5")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    internal class TestBed : ITestBed
    {
        private int _XPTO = 1024;

        public int GetXPTO() => _XPTO;
        public void SetXPTO(int value)=>_XPTO = value;
    }
}

OBS.: To compile successfully, I had to, for some reason, build the project twice. The first time Visual Studio is unable to successfully build, with the following error:

MSB3217 
Cannot register assembly "" Could not load file or 
assembly 'System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. 
The system cannot find the file specified.`

Then I have to rebuild it again without cleaning the project. Only then the project compile successfully.


Update 2

If anyone wants to help, I put this test bed project on GitHub here.


Update 3

After following Simon Mourier's suggestion of using dscom to create and register a TypeLib, I was able to add it as a Reference in Excel.

However, when I try to execute a simple test...

Sub Test()

    Dim xpto As New COMTestBedCS.TestBed
    Debug.Print xpto.GetXPTO()
    
End Sub

it blows up on me, with the following error: Class not registered.


c# com com-interop .net-8.0