Bagikan melalui


invalidApartmentStateChange MDA

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 metode CoInitializeEx) 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);
        }
    }
}

Lihat juga