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.