Sdílet prostřednictvím


invalidApartmentStateChange – pomocník spravovaného ladění (MDA)

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Spravovaný invalidApartmentStateChange pomocník pro ladění (MDS) je aktivovaný některým ze dvou problémů:

  • Došlo k pokusu o změnu stavu bytu modelu COM vlákna, které již bylo inicializováno objektem COM na jiný stav bytu.

  • Stav objektu COM ve vlákně se neočekávaně změní.

Příznaky

  • Stav apartmánu COM vlákna není to, co bylo požadováno. To může způsobit použití proxy pro komponenty modelu COM, které mají model vláken, který se liší od aktuálního modelu. To zase může způsobit InvalidCastException vyvolání při volání objektu COM prostřednictvím rozhraní, která nejsou nastavena pro zařazování mezi apartmány.

  • Stav objektu COM ve vlákně se liší od očekávání. To může způsobit COMException hrESULT RPC_E_WRONG_THREAD a InvalidCastException také při volání obálky s možností volání modulu runtime (RCW). To může také způsobit, že některé komponenty modelu COM s jedním vláknem budou současně přístupné více vlákny, což může vést k poškození nebo ztrátě dat.

Příčina

  • Vlákno bylo dříve inicializováno do jiného stavu apartmánu COM. Všimněte si, že stav apartmánu vlákna lze nastavit explicitně nebo implicitně. Explicitní operace zahrnují Thread.ApartmentState vlastnost a SetApartmentState metody.TrySetApartmentState Vlákno vytvořené pomocí Start metody je implicitně nastaveno, MTA pokud SetApartmentState není volána před spuštěním vlákna. Hlavní vlákno aplikace je také implicitně inicializováno, MTA pokud STAThreadAttribute atribut není zadán v hlavní metodě.

  • Metoda CoUninitialize (nebo CoInitializeEx metoda) s jiným modelem souběžnosti se volá ve vlákně.

Rozlišení

Před zahájením provádění nastavte stav apartmánu vlákna nebo použijte STAThreadAttribute atribut nebo MTAThreadAttribute atribut na hlavní metodu aplikace.

V ideálním případě by měl být kód, který volá metodu CoUninitialize , upraven tak, aby zpozdili volání, dokud se vlákno neskončí a nejsou k dispozici žádné RCWs a jejich základní komponenty MODELU COM stále používají vlákno. Pokud však není možné upravit kód, který volá metodu CoUninitialize , neměly by být použity žádné RCWs z vláken, které jsou tímto způsobem neinicializovány.

Vliv na modul runtime

Tento mdA nemá žádný vliv na CLR.

Výstup

Stav objektu COM v aktuálním vlákně a stav, který se kód pokusil použít.

Konfigurace

<mdaConfig>
  <assistants>
    <invalidApartmentStateChange />
  </assistants>
</mdaConfig>

Příklad

Následující příklad kódu ukazuje situaci, která může aktivovat tuto mdA.

using System.Threading;
namespace ApartmentStateMDA
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
        }
    }
}

Viz také