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.
Note
Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.
Asisten nonComVisibleBaseClass penelusuran kesalahan terkelola (MDA) diaktifkan ketika QueryInterface panggilan dilakukan oleh kode asli atau tidak terkelola pada com callable wrapper (CCW) dari kelas terkelola yang terlihat COM yang berasal dari kelas dasar yang tidak terlihat COM. Panggilan QueryInterface menyebabkan MDA diaktifkan hanya dalam kasus di mana panggilan meminta antarmuka kelas atau default IDispatch kelas terkelola yang terlihat COM. MDA tidak diaktifkan ketika QueryInterface adalah untuk antarmuka eksplisit yang memiliki ClassInterfaceAttribute atribut 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 QueryInterface panggilan yang akan menyebabkan aktivasi MDA ini.
Penyebab
Runtime tidak dapat mengizinkan QueryInterface panggilan untuk antarmuka kelas atau antarmuka default IDispatch 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 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.
Resolution
Jangan mengekspos antarmuka kelas. Tentukan antarmuka eksplisit dan terapkan ClassInterfaceAttribute atribut ke antarmuka tersebut.
Efek pada Runtime
MDA ini tidak berpengaruh pada CLR.
Hasil
Berikut ini adalah contoh pesan untuk QueryInterface panggilan pada kelas Derived yang terlihat COM yang berasal dari kelas Baseyang 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>