Как предоставить перечисление, определенное в 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 и не фактическое перечисление.
Поэтому я думаю, что понимаю проблему, и я хотел бы знать, есть ли способ заставить это работать, используя перечисления, которые не включают взлом любого промежуточного или автоматически сгенерированного кода.