Comparteix a través de


invalidApartmentStateChange MDA

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El invalidApartmentStateChange asistente de depuración administrada (MDS) se activa mediante cualquiera de estos dos problemas:

  • Se intenta cambiar el estado del apartamento COM de un subproceso que ya se ha inicializado por COM a otro estado de apartamento.

  • El estado del apartamento COM de un subproceso cambia inesperadamente.

Síntomas

  • El estado del apartamento COM de un subproceso no es lo que se solicitó. Esto puede hacer que los servidores proxy se usen para los componentes COM que tienen un modelo de subprocesos diferente del actual. Esto, a su vez, puede provocar que se produzca una InvalidCastException excepción al llamar al objeto COM a través de interfaces que no están configuradas para la serialización entre apartamentos.

  • El estado del apartamento COM del subproceso es diferente del esperado. Esto puede provocar un COMException con un HRESULT de RPC_E_WRONG_THREAD, así como al InvalidCastException realizar llamadas en un contenedor invocable en tiempo de ejecución (RCW). Esto también puede hacer que varios subprocesos accedan a algunos componentes COM de un solo subproceso al mismo tiempo, lo que puede provocar daños o pérdidas de datos.

Causa

  • El subproceso se inicializó anteriormente en un estado de apartamento COM diferente. Tenga en cuenta que el estado de apartamento de un subproceso se puede establecer explícita o implícitamente. Las operaciones explícitas incluyen la Thread.ApartmentState propiedad y los SetApartmentState métodos y TrySetApartmentState . Un subproceso creado con el Start método se establece implícitamente en a MTA menos que SetApartmentState se llame a antes de que se inicie el subproceso. El subproceso principal de la aplicación también se inicializa implícitamente a MTA menos que se especifique el STAThreadAttribute atributo en el método principal.

  • Se llama al CoUninitialize método (o al CoInitializeEx método) con un modelo de simultaneidad diferente en el subproceso.

Resolution

Establezca el estado de apartamento del subproceso antes de empezar a ejecutarse o aplique el STAThreadAttribute atributo o el MTAThreadAttribute atributo al método principal de la aplicación.

Para la segunda causa, idealmente, el código que llama al CoUninitialize método debe modificarse para retrasar la llamada hasta que el subproceso está a punto de finalizar y no hay RCW y sus componentes COM subyacentes todavía están en uso por el subproceso. Sin embargo, si no es posible modificar el código que llama al CoUninitialize método , no se debe usar ningún RCWs desde subprocesos que no estén inicializados de esta manera.

Efecto en el tiempo de ejecución

Este MDA no tiene ningún efecto en clR.

Salida

Estado de apartamento COM del subproceso actual y el estado que el código estaba intentando aplicar.

Configuración

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

Ejemplo

En el ejemplo de código siguiente se muestra una situación que puede activar este MDA.

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

Consulte también