Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, tra cui .NET 6 e versioni successive.
L'assistente invalidApartmentStateChange al debug gestito viene attivato da uno dei due problemi seguenti:
Viene effettuato un tentativo di modificare lo stato dell'apartment COM di un thread che è già stato inizializzato da COM in uno stato di apartment diverso.
Lo stato dell'apartment COM di un thread cambia in modo imprevisto.
Symptoms
Lo stato dell'apartment COM di un thread non è quello richiesto. Ciò può causare l'uso di proxy per i componenti COM con un modello di threading diverso da quello corrente. Questo a sua volta può causare un'eccezione InvalidCastException quando si chiama l'oggetto COM tramite interfacce non configurate per il marshalling tra apartment.
Lo stato dell'apartment COM del thread è diverso dal previsto. Ciò può causare un oggetto COMException con un valore HRESULT di RPC_E_WRONG_THREAD e un InvalidCastException oggetto durante l'esecuzione di chiamate su un runtime Callable Wrapper (RCW). Ciò può anche causare l'accesso a alcuni componenti COM a thread singolo da più thread contemporaneamente, che possono causare danneggiamento o perdita di dati.
Motivo
Il thread è stato inizializzato in precedenza in uno stato di apartment COM diverso. Si noti che lo stato apartment di un thread può essere impostato in modo esplicito o implicito. Le operazioni esplicite includono la Thread.ApartmentState proprietà e i SetApartmentState metodi e TrySetApartmentState . Un thread creato tramite il Start metodo viene impostato in modo implicito su MTA , a meno che non SetApartmentState venga chiamato prima dell'avvio del thread. Anche il thread principale dell'applicazione viene inizializzato in modo implicito a, a MTA meno che l'attributo STAThreadAttribute non sia specificato nel metodo main.
Il
CoUninitializemetodo (o ilCoInitializeExmetodo) con un modello di concorrenza diverso viene chiamato nel thread.
Resolution
Impostare lo stato apartment del thread prima di iniziare l'esecuzione oppure applicare l'attributo STAThreadAttribute o l'attributo MTAThreadAttribute al metodo main dell'applicazione.
Per la seconda causa, idealmente, il codice che chiama il CoUninitialize metodo deve essere modificato per ritardare la chiamata fino a quando il thread non sta per terminare e non ci sono RCW e i relativi componenti COM sottostanti ancora in uso dal thread. Tuttavia, se non è possibile modificare il codice che chiama il CoUninitialize metodo , non è consigliabile usare RCW dai thread non inizializzati in questo modo.
Effetto sul runtime
Questo assistente al debug gestito non ha alcun effetto su CLR.
Risultato
Lo stato apartment COM del thread corrente e lo stato che il codice stava tentando di applicare.
Configurazione
<mdaConfig>
<assistants>
<invalidApartmentStateChange />
</assistants>
</mdaConfig>
Esempio
Nell'esempio di codice seguente viene illustrata una situazione in grado di attivare questo assistente al debug gestito.
using System.Threading;
namespace ApartmentStateMDA
{
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
}
}