Как предоставить перечисление, определенное в COM-библиотеке, через взаимодействие как тип возврата функции c #

Надеюсь, вопрос ясен, но для ясности:

У меня есть VB6 dll, который определяет перечисление, на которое я ссылаюсь в моей C # dll. DLL C # правильно определяет CCW с помощью интерфейса idispatch, который объявляет функцию, типом возвращаемой которой является enum.

При запуске regasm я получаю предупреждение о том, что enum не виден в COM и поэтому функция не экспортируется. Поскольку он определен в моей библиотеке VB6, я бы подумал, что он уже виден COM, поскольку он определен в COM-библиотеке DLL.

Я понимаю, что могу перестать возиться и использовать int для передачи enum и просто выполнять приведение любого конца, но это разочаровывает, и я хотел бы знать, существует ли способ.

В соответствии с запросом приведен пример кода:

VB6 dll определяет перечисление

Public Enum myEnum
    first = 0
    second = 1
End Enum

Это импортируется через взаимодействие в C #, и если вы просматриваете метаданные, это выглядит примерно так

[Guid("EnumGUID")]
public enum myEnum
{
    first = 0,
    second = 1        
}

Тогда интерфейс CCW определен

[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
    [DispId(1)]
    myEnum myFunction();
}

Regasm жалуется, что myEnum не виден. Я должен согласиться с этим, поскольку представление метаданных не имеет атрибута com visible. Странно, если я использую другие типы, определенные в dll VB для аргументов функции, я не получаю жалоб, это просто кажется enum, и я угадываю это, потому что я фактически выставляю взаимосвязанную реализацию перечисления VB6 и не фактическое перечисление.

Поэтому я думаю, что понимаю проблему, и я хотел бы знать, есть ли способ заставить это работать, используя перечисления, которые не включают взлом любого промежуточного или автоматически сгенерированного кода.

Ответы на вопрос(2)

Ваш ответ на вопрос