Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O invalidApartmentStateChange assistente de depuração gerido (MDS) é ativado por um de dois problemas:
É feita uma tentativa de alterar o estado do apartamento COM de uma thread que já foi inicializada pela COM para outro estado de apartamento.
O estado do apartamento COM de um tópico muda inesperadamente.
Sintomas
O estado do apartamento COM de um tópico não foi o que foi solicitado. Isto pode fazer com que proxies sejam usados para componentes COM que tenham um modelo de threading diferente do atual. Isto, por sua vez, pode causar um lançamento de um InvalidCastException ao chamar o objeto COM através de interfaces que não estão configuradas para marshalling entre apartamentos.
O estado do apartamento COM do tópico é diferente do esperado. Isto pode causar a COMException com um HRESULT de RPC_E_WRONG_THREAD bem como um InvalidCastException ao fazer chamadas num Runtime Callable Wrapper (RCW). Isto pode também fazer com que alguns componentes COM single-threaded sejam acedidos por múltiplas threads ao mesmo tempo, o que pode levar à corrupção ou perda de dados.
Motivo
A thread foi anteriormente inicializada para um estado diferente do apartamento COM. Note que o estado apartamento de uma thread pode ser definido de forma explícita ou implícita. As operações explícitas incluem a Thread.ApartmentState propriedade e os SetApartmentState métodos e TrySetApartmentState . Um thread criado usando o Start método é implicitamente definido como MTA a menos que SetApartmentState seja chamado antes do início do thread. O thread principal da aplicação também é implicitamente inicializado para MTA , a menos que o STAThreadAttribute atributo seja especificado no método principal.
O
CoUninitializemétodo (ou oCoInitializeExmétodo) com um modelo de concorrência diferente é chamado no fio.
Resolução
Defina o estado apartamento da thread antes de começar a executar, ou aplique o STAThreadAttribute atributo ou o MTAThreadAttribute atributo ao método principal da aplicação.
Pela segunda razão, idealmente, o código que chama o CoUninitialize método deve ser modificado para atrasar a chamada até que a thread esteja prestes a terminar e não existam RCWs nem os seus componentes COM subjacentes ainda em uso pela thread. No entanto, se não for possível modificar o código que chama o CoUninitialize método, então não devem ser usados RCWs a partir de threads não inicializados desta forma.
Efeito no tempo de execução
Este MDA não tem efeito no CLR.
Output
O estado do apartamento COM do tópico atual, e o estado em que o código tentava aplicar-se.
Configuração
<mdaConfig>
<assistants>
<invalidApartmentStateChange />
</assistants>
</mdaConfig>
Exemplo
O exemplo de código seguinte demonstra uma situação que pode ativar este MDA.
using System.Threading;
namespace ApartmentStateMDA
{
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
}
}