Mam nadzieję, że pytanie jest jasne, ale pad to dla jasności:Jak narazić enum zdefiniowane w bibliotece COM poprzez współdziałanie jako typ zwracanej aC# funkcji
Mam dll VB6, który definiuje enum że Odwołuję się w moim C# dll. C# dll definiuje CCW w prawidłowy sposób za pomocą interfejsu idispatch, który deklaruje funkcję, której typem powrotu jest enum.
Po uruchomieniu regresji pojawia się ostrzeżenie, że wyliczenie nie jest widoczne w COM, więc funkcja nie jest eksportowana. Ponieważ jest on zdefiniowany w mojej bibliotece VB6, pomyślałbym, że jest już widoczny w COM, ponieważ jest zdefiniowany w bibliotece dll COM.
Zdaję sobie sprawę, że mogę przestać się bawić i używać int do przekazywania enum i po prostu rzucać oba końce, ale to jest właściwe frustrujące i chciałbym wiedzieć, czy istnieje sposób.
Zgodnie z wnioskiem o to niektóre przykładowy kod:
dll VB6 definiuje enum
Public Enum myEnum
first = 0
second = 1
End Enum
To jest importowane poprzez współdziałanie w języku C# i jeśli przeglądać metadane wygląda coś takiego
[Guid("EnumGUID")]
public enum myEnum
{
first = 0,
second = 1
}
Następnie interfejs CCW jest zdefiniowany
[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
[DispId(1)]
myEnum myFunction();
}
Regasm skarży się, że myEum nie jest widoczny. Muszę się z tym zgodzić, ponieważ widok metadanych nie ma widocznego atrybutu. O dziwo jeśli używam innych typów definiuje w bibliotece DLL VB argumenty funkcji nie otrzymuję skarg, to po prostu wydaje się być enum i domyślam się, że to dlatego, że faktycznie wystawiam interopped implementację wyliczenia VB6, a nie rzeczywiste wyliczenie.
Więc myślę, że rozumiem problem, chciałbym wiedzieć, czy istnieje sposób, aby to działało przy użyciu wyliczeń, które nie wymagają hakowania pośredniego lub generowanego automatycznie kodu.
Czy dll VB6 jest dll COM? Pokaż nam kod, aby zrozumieć problem. –