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 subprocesamiento 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 apartamento de un único subproceso (STA) que sólo contenga un subproceso, o un apartamento 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 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 utilizando la propiedad System.Threading.ApartmentState; se producía una condición de anticipación. 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 los formularios Windows Forms inicialicen elementos como arrastrar y colocar, hay que crear e introducir un apartamento de un único subproceso.
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