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:
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.
