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

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

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

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

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

По запросу вот пример кода:

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

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

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

5
задан Benjamin 14 July 2014 в 22:37
поделиться