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