Udostępnij za pośrednictwem


nonComVisibleBaseClass MDA

Uwaga

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.

nonComVisibleBaseClass Asystent zarządzanego debugowania (MDA) jest aktywowany, gdy QueryInterface wywołanie jest wykonywane przez natywny lub niezarządzany kod w otoce wywoływanej modelu COM (CCW) klasy zarządzanej widocznej dla modelu COM pochodzącej z klasy bazowej, która nie jest widoczna dla modelu COM. Wywołanie QueryInterface powoduje aktywację MDA tylko w przypadkach, gdy wywołanie żąda interfejsu klasy lub domyślnej IDispatch klasy zarządzanej widocznej dla modelu COM. Funkcja MDA nie jest aktywowana, gdy QueryInterface element jest przeznaczony dla jawnego interfejsu ClassInterfaceAttribute , który ma 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 tym, że środowisko uruchomieniowe nie zezwala na QueryInterface wywołania, które mogłyby spowodować aktywację tego rozwiązania MDA.

Przyczyna

Środowisko uruchomieniowe nie może zezwalać na QueryInterface wywołania interfejsu klasy lub interfejsu domyślnego IDispatch klasy widocznej dla modelu COM pochodzącej z klasy, która nie jest widoczna z powodu potencjalnych problemów z wersją. Jeśli na przykład jakiekolwiek publiczne elementy członkowskie zostały dodane do klasy bazowej, która nie jest widoczna dla modelu COM, istniejący klienci COM używający 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

Ta usługa MDA nie ma wpływu na CLR.

Wyjście

Poniżej znajduje się przykładowy komunikat dla QueryInterface wywołania klasy Derived widocznej dla modelu COM, który pochodzi z klasy Basenieokrywnej niż 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.

Konfigurowanie

<mdaConfig>
  <assistants>
    <nonComVisibleBaseClass />
  </assistants>
</mdaConfig>

Zobacz też