Jak ujawnić wyliczenie zdefiniowane w bibliotece COM przez interop jako typ powrotu funkcji c #

Miejmy nadzieję, że pytanie jest jasne, ale żeby to wyjaśnić:

Mam dll VB6, który definiuje enum, które odwołuję się w moim dll C #. C # dll definiuje CCW we właściwy sposób za pomocą interfejsu idispatch, który deklaruje funkcję, której typem powrotu jest enum.

Podczas uruchamiania regazmu otrzymuję ostrzeżenie, że wyliczenie nie jest widoczne na COM i dlatego funkcja nie jest eksportowana. Ponieważ jest zdefiniowany w mojej bibliotece VB6, pomyślałbym, że jest już widoczny jako COM, ponieważ jest zdefiniowany w dll COM.

Zdaję sobie sprawę, że mogę przestać oszukiwać i używać int, aby przekazać enum i po prostu wykonać casting na końcu, ale jest to frustrujące i chciałbym wiedzieć, czy istnieje sposób.

Zgodnie z żądaniem tutaj znajduje się przykładowy kod:

VB6 dll definiuje enum

Public Enum myEnum
    first = 0
    second = 1
End Enum

Zostanie on zaimportowany przez interop do C # i jeśli zobaczysz metadane, wygląda to mniej więcej tak

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

Następnie definiowany jest interfejs CCW

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

Regasm narzeka, że ​​mojeEnum nie jest widoczne. Muszę się z tym zgodzić, ponieważ widok metadanych nie ma atrybutu com visible. Dziwne, jeśli używam innych typów definiuje w dll VB dla argumentów funkcji Nie dostaję żadnych skarg, po prostu wydaje się być enum i zgaduję, że to dlatego, że faktycznie ujawniam przerywaną implementację enum VB6, a nie rzeczywista enum.

Myślę więc, że rozumiem ten problem, chciałbym wiedzieć, czy istnieje sposób, aby to działało przy użyciu wyrażeń, które nie wymagają hakowania kodu pośredniego lub wygenerowanego automatycznie.

questionAnswers(2)

yourAnswerToTheQuestion