Share via


disconnectedContext-MDA

Aktualisiert: November 2007

Der disconnectedContext-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn die CLR einen Übergang zu einem nicht verbundenen Apartment bzw. Kontext versucht, während gerade eine Anforderung für ein COM-Objekt verarbeitet wird.

Symptome

Für einen Runtime Callable Wrapper (RCW) (RCW) ausgeführte Aufrufe werden an die zugrunde liegende COM-Komponente im aktuellen Apartment oder Kontext übergeben, nicht an die Komponente, die sie enthält. Dies kann zur Beschädigung oder zum Verlust von Daten führen, wenn die COM-Komponente nicht Multithread-fähig ist, wie dies bei STA-Komponenten (Singlethread-Apartment) der Fall ist. Wenn es sich bei dem RCW selbst um einen Proxy handelt, wird durch den Aufruf möglicherweise aber auch eine COMException-Ausnahme mit dem HRESULT-Rückgabewert RPC_E_WRONG_THREAD ausgelöst.

Ursache

Das OLE-Apartment oder der Kontext wurden geschlossen, als die CLR einen Übergang durchzuführen versuchte. Dies wird meist durch STA-Apartments hervorgerufen, die geschlossen werden, bevor alle sich im Besitz des Apartments befindlichen COM-Komponenten vollständig freigegeben wurden. Dazu kann es nach einem expliziten Aufruf aus Benutzercode in einem RCW kommen, oder während die CLR selbst die COM-Komponente bearbeitet, beispielsweise wenn die CLR die COM-Komponente nach abgeschlossener Garbage Collection des zugehörigen RCW freigibt.

Lösung

Stellen Sie zur Vermeidung dieses Problems sicher, dass der Thread, in dessen Besitz sich das STA befindet, nicht beendet wird, bevor die Anwendung die Bearbeitung aller Objekte in diesem Apartment abgeschlossen hat. Dasselbe gilt für Kontexte. Stellen Sie sicher, dass ein Kontext nicht geschlossen wird, bevor die Anwendung die Bearbeitung aller COM-Komponenten in diesem Kontext abgeschlossen hat.

Auswirkungen auf die Laufzeit

Dieser MDA hat keine Auswirkungen auf die CLR. Es werden nur Angaben über den nicht verbundenen Kontext gemeldet.

Ausgabe

Es wird das Kontextcookie des nicht verbundenen Apartments oder Kontexts gemeldet.

Konfiguration

<mdaConfig>
  <assistants>
    <disconnectedContext enable="false" />
  </assistants>
</mdaConfig>

Siehe auch

Konzepte

Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen

Übersicht über das Interop-Marshalling

Referenz

MarshalAsAttribute

Weitere Ressourcen

Interoperabilität