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 Baseniewidocznej 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ż