nonComVisibleBaseClass MDA
nonComVisibleBaseClass
Zarządzany asystent debugowania (MDA) jest aktywowany, gdy QueryInterface
wywołanie jest wykonywane przez natywny lub niezarządzany kod w otoce wywołującej COM (CCW) klasy zarządzanej widocznej dla modelu COM pochodzącej z klasy bazowej, która nie jest widoczna w modelu COM. Wywołanie QueryInterface
powoduje aktywowanie usługi MDA tylko w przypadkach, gdy wywołanie żąda interfejsu klasy lub domyślnej IDispatch
klasy zarządzanej widocznej dla modelu COM. Usługa MDA nie jest aktywowana, gdy QueryInterface
element jest przeznaczony dla jawnego interfejsu, który ma ClassInterfaceAttribute zastosowany atrybut i jest jawnie implementowany przez klasę widoczną dla modelu COM.
Objawy
Wywołanie QueryInterface
wykonane z kodu natywnego, które kończy się niepowodzeniem z COR_E_INVALIDOPERATION HRESULT. HrESULT może być spowodowany przez środowisko uruchomieniowe, które zezwala QueryInterface
na wywołania, które spowodują aktywację tego rozwiązania MDA.
Przyczyna
Środowisko uruchomieniowe nie może zezwalać na QueryInterface
wywołania interfejsu klasy lub domyślnego IDispatch
interfejsu klasy widocznej w modelu COM pochodzącej z klasy, która nie jest widoczna z powodu potencjalnych problemów z przechowywaniem wersji. Jeśli na przykład do klasy bazowej nie są widoczne żadne publiczne elementy członkowskie, istniejący klienci COM korzystający z klasy pochodnej mogą potencjalnie przerwać, ponieważ tabela wirtualna klasy pochodnej, która zawiera składowe klasy bazowej, zostanie zmieniona przez taką zmianę. Jawne interfejsy uwidocznione w modelu COM nie mają tego problemu, ponieważ nie zawierają podstawowych elementów członkowskich interfejsów w tabeli wirtualnej.
Rozwiązanie
Nie uwidaczniaj interfejsu klasy. Zdefiniuj jawny interfejs i zastosuj ClassInterfaceAttribute do niego atrybut.
Wpływ na środowisko uruchomieniowe
To rozwiązanie MDA nie ma wpływu na clR.
Dane wyjściowe
Poniżej znajduje się przykładowy komunikat dotyczący QueryInterface
wywołania klasy Derived
WIDOCZNEj dla modelu COM, która pochodzi z klasy Base
niewidocznej dla modelu COM.
A QueryInterface call was made requesting the class interface of COM
visible managed class 'Derived'. However since this class derives from
non COM visible class 'Base', the QueryInterface call will fail. This
is done to prevent the non COM visible base class from being
constrained by the COM versioning rules.
Konfiguracja
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla