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:
What am I doing wrong?
For completion sake, here's the project file:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>
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
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RootNamespace>COMTestBedCS</RootNamespace>
<TargetFramework>net8.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<EnableComHosting>true</EnableComHosting>
<RegisterForComInterop>True</RegisterForComInterop>
<Platforms>x86</Platforms>
<RegisterAssemblyMSBuildArchitecture>x86</RegisterAssemblyMSBuildArchitecture>
</PropertyGroup>
</Project>
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 "<assembly file>" 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.

COMTestBedCS.dlleither in your machine's PATH or in the same directory or subdirectory of your application? Being as that you said you're running out of Excel, it will likely need to be in your machine's PATHc:\windows\system32for example.<yourfile>.comhost.dllthat's been generated instead of the .NET dll itself: learn.microsoft.com/en-us/dotnet/core/native-interop/… Also note no TLB will be generated by .NET Core (any version).EnableComHostingdoesn't appear in my list of possible options in the project editor. And, second, if I add it anyway, I get the following error:The "GenerateClsidMap" task failed unexpectedly.