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 (MDS) invalidApartmentStateChange diaktifkan oleh salah satu dari dua masalah:
Upaya dilakukan untuk mengubah status apartemen COM dari rangkaian yang telah diinisialisasi oleh COM ke keadaan apartemen yang berbeda.
Status apartemen COM dari rangkaian berubah secara tak terduga.
Gejala
Status apartemen COM rangkaian bukanlah apa yang diminta. Ini dapat menyebabkan proksi digunakan untuk komponen COM yang memiliki model rangkaian yang berbeda dari yang saat ini. Ini pada gilirannya dapat menyebabkan InvalidCastException dilemparkan saat memanggil objek COM melalui antarmuka yang tidak diatur untuk penyusunan lintas apartemen.
Status apartemen COM dari rangkaian berbeda dari yang diharapkan. Perbedaan ini dapat menyebabkan COMException dengan HRESULT RPC_E_WRONG_THREAD serta InvalidCastException saat melakukan panggilan pada Runtime Callable Wrapper (RCW). Ini juga dapat menyebabkan beberapa komponen COM rangkaian tunggal diakses oleh beberapa rangkaian secara bersamaan, yang dapat menyebabkan kerusakan atau kehilangan data.
Penyebab
Rangkaian ini sebelumnya diinisialisasi ke status apartemen COM yang berbeda. Perhatikan bahwa status apartemen rangkaian dapat diatur baik secara eksplisit atau implisit. Operasi eksplisit mencakup properti Thread.ApartmentState dan metode SetApartmentState dan TrySetApartmentState. rangkaian yang dibuat menggunakan metode Start diatur secara implisit ke MTA kecuali SetApartmentState dipanggil sebelum rangkaian dimulai. Rangkaian utama aplikasi juga secara implisit diinisialisasi ke MTA kecuali atribut STAThreadAttribute ditentukan pada metode utama.
Metode
CoUninitialize(atau metodeCoInitializeEx) dengan model konkurensi yang berbeda dipanggil pada rangkaian.
Resolusi
Atur status apartemen rangkaian sebelum mulai dieksekusi, atau terapkan atribut STAThreadAttribute atau atribut MTAThreadAttribute ke metode utama aplikasi.
Untuk penyebab kedua, idealnya, kode yang memanggil metode CoUninitialize harus dimodifikasi untuk menunda panggilan sampai rangkaian akan dihentikan dan tidak ada RCW dan komponen COM yang mendasarnya masih digunakan oleh rangkaian. Namun, jika tidak mungkin untuk memodifikasi kode yang memanggil metode CoUninitialize, maka tidak ada RCW yang harus digunakan dari rangkaian yang tidak diinisialisasi dengan cara ini.
Efek pada Runtime
MDA ini tidak berpengaruh pada runtime bahasa umum.
Output
Status apartemen COM dari rangkaian saat ini, dan status bahwa kode mencoba untuk diterapkan.
Konfigurasi
<mdaConfig>
<assistants>
<invalidApartmentStateChange />
</assistants>
</mdaConfig>
Contoh
Contoh kode berikut menunjukkan situasi yang dapat mengaktifkan MDA ini.
using System.Threading;
namespace ApartmentStateMDA
{
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
}
}