Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.
Der invalidApartmentStateChange verwaltete Debugging-Assistent (MANAGED Debugging Assistant, MDS) wird durch eines von zwei Problemen aktiviert:
Es wird versucht, den COM-Apartmentzustand eines Threads zu ändern, der bereits von COM in einen anderen Apartmentzustand initialisiert wurde.
Der COM-Apartmentzustand eines Threads ändert sich unerwartet.
Symptome
Der COM-Apartmentzustand eines Threads ist nicht das, was angefordert wurde. Dies kann dazu führen, dass Proxys für COM-Komponenten verwendet werden, die ein Threadingmodell aufweisen, das sich von der aktuellen unterscheidet. Dies kann wiederum dazu führen, dass ein InvalidCastException Auslösen ausgelöst wird, wenn das COM-Objekt über Schnittstellen aufgerufen wird, die nicht für apartmentübergreifendes Marshalling eingerichtet sind.
Der COM-Apartmentzustand des Threads unterscheidet sich von der erwarteten. Dies kann zu COMException einem HRESULT von RPC_E_WRONG_THREAD sowie zu einem InvalidCastException Aufruf an einem Runtime Callable Wrapper (RCW) führen. Dies kann auch dazu führen, dass von mehreren Threads gleichzeitig auf einige com-Komponenten mit einem Thread zugegriffen wird, was zu Beschädigungen oder Datenverlusten führen kann.
Ursache
Der Thread wurde zuvor in einen anderen COM-Apartmentzustand initialisiert. Beachten Sie, dass der Apartmentzustand eines Threads explizit oder implizit festgelegt werden kann. Die expliziten Vorgänge umfassen die Thread.ApartmentState Eigenschaft und die SetApartmentState Methoden TrySetApartmentState . Ein mit der Start Methode erstellter Thread wird implizit so festgelegt, MTA dass er nicht SetApartmentState aufgerufen wird, bevor der Thread gestartet wird. Der Hauptthread der Anwendung wird auch implizit initialisiert, MTA es sei denn, das STAThreadAttribute Attribut wird für die Hauptmethode angegeben.
Die
CoUninitializeMethode (oder dieCoInitializeExMethode) mit einem anderen Parallelitätsmodell wird für den Thread aufgerufen.
Resolution
Legen Sie den Apartmentzustand des Threads fest, bevor er mit der Ausführung beginnt, oder wenden Sie entweder das STAThreadAttribute Attribut oder das MTAThreadAttribute Attribut auf die Hauptmethode der Anwendung an.
Für die zweite Ursache sollte der Code, der die CoUninitialize Methode aufruft, geändert werden, um den Aufruf zu verzögern, bis der Thread beendet wird, und es gibt keine RCWs und ihre zugrunde liegenden COM-Komponenten, die noch vom Thread verwendet werden. Wenn es jedoch nicht möglich ist, den Code zu ändern, der die CoUninitialize Methode aufruft, sollten keine RCWs aus Threads verwendet werden, die auf diese Weise nicht initialisiert sind.
Effekt auf die Laufzeit
Diese MDA hat keine Auswirkungen auf die CLR.
Output
Der COM-Apartmentstatus des aktuellen Threads und der Zustand, auf den der Code angewendet wurde.
Konfiguration
<mdaConfig>
<assistants>
<invalidApartmentStateChange />
</assistants>
</mdaConfig>
Beispiel
Im folgenden Codebeispiel wird eine Situation veranschaulicht, in der diese MDA aktiviert werden kann.
using System.Threading;
namespace ApartmentStateMDA
{
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
}
}