Subprocesamiento administrado y no administrado

Los componentes COM usan apartamentos para sincronizar el acceso a los recursos. Por el contrario, los objetos administrados usan regiones sincronizadas, tipos de sincronización primitivos como las exclusiones mutuas (mutex), bloqueos y puertos de terminación, y contextos sincronizados para garantizar que todos los recursos compartidos se usan de manera segura para el subproceso. Para obtener más información sobre el modelo de subprocesos de .NET, vea Subprocesamiento administrado.

Para la interoperabilidad, Common Language Runtime crea e inicializa un apartamento al llamar a un objeto COM. Un subproceso administrado puede crear y entrar en un contenedor uniproceso (STA) que sólo contenga un subproceso, o un contenedor multiproceso (MTA) que contenga uno o varios subprocesos. Si un apartamento COM y un apartamento generado por un subproceso son compatibles, COM permite que el subproceso que llama realice llamadas directamente al objeto COM. Si los apartamentos son incompatibles, COM crea un apartamento compatible y calcula las referencias de todas las llamadas mediante un proxy en el nuevo apartamento.

El motor en tiempo de ejecución llama a CoInitializeEx para inicializar el apartamento COM como un apartamento MTA o STA. En la versión 2.0 de .NET Framework, los subprocesos administrados se inicializan como MTA si no se ha establecido su estado de apartamento antes de iniciar el subproceso. Utilice el método SetApartmentState o TrySetApartmentState para establecer el estado de apartamento antes de iniciar el subproceso.

En la versión 2.0 de .NET Framework, el subproceso de aplicación principal se inicializa como MTA, salvo que se aplique STAThreadAttribute al procedimiento de punto de entrada.

Nota

En las versiones 1.0 y 1.1 de .NET Framework, el estado de apartamento podía establecerse después de ejecutar el subproceso mediante la propiedad System.Threading.ApartmentState; se producía una condición de carrera.Esto no se permite en la versión 2.0 de .NET Framework.

Algunos modelos de programación requieren que se establezca la propiedad STA en un subproceso. Por ejemplo, para que Windows Forms inicialice elementos como arrastrar y colocar, hay que crear e introducir un contenedor uniproceso.

Nota

Si el proxy y el código auxiliar no están registrados y tampoco lo está la biblioteca de tipos, se puede producir una excepción InvalidCastException al llamar a un objeto COM desde código administrado.

En la tabla siguiente se muestran los valores de enumeración ApartmentState con la llamada de inicialización de apartamento COM correspondiente.

Valor de enumeración ApartmentState

Inicialización de apartamento COM

MTA

CoInitializeEx(NULL, COINIT_MULTITHREADED)

STA

CoIntializeEx(NULL, COINIT_APARTMENTTHREADED)

Desconocido

CoInitializeEx(NULL, COINIT_MULTITHREADED)

Siempre que el objeto COM y el subproceso administrado estén en apartamentos incompatibles, todas las llamadas del objeto se harán a través de un proxy creado por COM.

Vea también

Conceptos

Exponer componentes COM en .NET Framework

Exponer componentes de .NET Framework en COM

Otros recursos

Interoperabilidad COM avanzada