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 Base
nieokrywnej 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>