Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Catatan
Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.
Asisten penelusuran kesalahan terkelola (MDA) nonComVisibleBaseClass diaktifkan saat panggilan QueryInterface dilakukan oleh kode asli atau tidak terkelola pada pembungkus yang dapat dipanggil COM (CCW) dari kelas terkelola yang terlihat COM yang berasal dari kelas dasar yang tidak terlihat COM. Panggilan QueryInterface menyebabkan MDA diaktifkan hanya dalam kasus saat panggilan meminta antarmuka kelas atau IDispatch default kelas terkelola yang terlihat COM. MDA tidak diaktifkan saat QueryInterface adalah untuk antarmuka eksplisit yang memiliki atribut ClassInterfaceAttribute yang diterapkan dan secara eksplisit diimplementasikan oleh kelas yang terlihat COM.
Gejala
Panggilan QueryInterface yang dilakukan dari kode asli yang gagal dengan COR_E_INVALIDOPERATION HRESULT. HRESULT mungkin karena runtime melarang panggilan QueryInterface yang akan menyebabkan aktivasi MDA ini.
Penyebab
Runtime tidak dapat mengizinkan panggilan QueryInterface untuk antarmuka kelas atau antarmuka IDispatch default kelas yang terlihat COM yang berasal dari kelas yang tidak terlihat COM karena potensi masalah penerapan versi. Misalnya, jika ada anggota publik yang ditambahkan ke kelas dasar yang tidak terlihat COM, klien COM yang ada menggunakan kelas turunan berpotensi rusak karena vtable dari kelas turunan, yang berisi anggota kelas dasar, akan diubah dengan perubahan seperti itu. Antarmuka eksplisit yang terekspos ke COM tidak memiliki masalah ini karena tidak menyertakan anggota dasar antarmuka dalam vtable.
Resolusi
Jangan mengekspos antarmuka kelas. Tentukan antarmuka eksplisit dan terapkan atribut ClassInterfaceAttribute ke antarmuka tersebut.
Efek pada Runtime
MDA ini tidak berpengaruh pada runtime bahasa umum.
Output
Berikut ini adalah contoh pesan untuk panggilan QueryInterface pada kelas Derived yang terlihat COM yang berasal dari kelas Base yang tidak terlihat 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.
Konfigurasi
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>