Как правильно создавать COM-классы с помощью .NET8?C#

Место общения программистов C#
Ответить
Anonymous
 Как правильно создавать COM-классы с помощью .NET8?

Сообщение Anonymous »

Мне нужно создать COM-класс в .NET8, который должен быть доступен для Excel.
После просмотра этого видео я реализовал следующий класс тестового стенда:

Код: Выделить всё

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;
}
}
Проект компилируется корректно, без ошибок. Однако когда я пытаюсь сослаться на этот тестовый стенд в Excel, я получаю следующую ошибку: Невозможно добавить ссылку на указанный файл.
Если я попытаюсь использовать regsvr32, я получаю следующую ошибку:
Изображение

Что я делаю не так?

Для завершения вот файл проекта:

Код: Выделить всё



net8.0
enable
enable
true



Обновление
Мне удалось правильно скомпилировать код и зарегистрируйте его с помощью regsvr32. Однако я по-прежнему не могу сослаться на него в Excel.
Во-первых, я не могу найти его в списке ссылок. Если я попытаюсь найти dll (либо сборку, либо comhost), произойдет сбой с сообщением: Невозможно добавить ссылку на указанный файл.
Теперь осталось только добавить его в качестве ссылки в Excel VBA.
Новый код
Проект

Код: Выделить всё



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



Код

Код: Выделить всё

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.: Для успешной компиляции мне по какой-то причине пришлось собирать проект дважды. В первый раз Visual Studio не может успешно выполнить сборку из-за следующей ошибки:

Код: Выделить всё

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.`
Затем мне придется пересобрать его снова без очистки проекта.
Только тогда проект успешно скомпилируется.
< hr />
Обновление 2
Если кто-то хочет помочь, я разместил этот тестовый проект на GitHub здесь.

Обновление 3
После предложения Саймона Мурье использовать dscom для создания и регистрации TypeLib, я смог добавить его в качестве ссылки в Excel.
Однако, когда я пытаюсь выполнить простой тест...

Код: Выделить всё

Sub Test()

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

End Sub
он ​​вылетает со следующей ошибкой: Класс не зарегистрирован.


Подробнее здесь: https://stackoverflow.com/questions/783 ... -with-net8
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»