2010-01-19 15 views
7

Al definir una clase COM-visible en C++ que puede definir el modelo apoyado roscado en el archivo de cabecera (la línea threading(single)):Cómo marcar los objetos .NET expuestos a COM-interoperabilidad como un único subproceso?

[ 
    coclass, 
    default(IComInterface), 
    threading(single), 
    vi_progid("Example.ComClass"), 
    progid("Example.ComClass.1"), 
    version(1.0), 
    uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD") 
] 

¿Hay una manera comparable de establecer el modelo de subprocesos de .NET (por ejemplo un atributo)? Actualmente defino mi COM de clase como tal:

[Guid("67155A91-2948-43f5-B07F-5C55CDD240E5")] 
[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IComInterface 
{ 
    ... 
} 


[Guid("DC5E6955-BB29-44c8-9FC0-6AADEEB2AFFB")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Example.ComClass")] 
public class ComClass : IComInterface 
{ 
    ... 
} 

--edit:

Los comentarios sobre la respuesta marcada son lo realmente importante. Parece que la única forma de decirle a RegAsm que configure un ThreadingModel diferente es escribiendo un método de registro personalizado marcado con el atributo [ComRegisterFunction].

Respuesta

6

Eso es realmente oscuro, nunca he visto el atributo "subprocesamiento" en MIDL. Tampoco tiene el MSDN Library authors.

Un COM coclass publica sus requisitos de subprocesamiento en el registro, utilizando la clave HKCR\CLSID\{guid}\InProcServer32. El valor de ThreadingModel declara el departamento que necesita. Si falta o está configurado en "Apartamento", anuncia que no es seguro para subprocesos y requiere ayuda de un subproceso STA. CoCreateInstance() usa este valor cuando crea el objeto. Si es necesario, iniciará un hilo STA y creará un proxy si el hilo actual no es STA, asegurándose de que siempre se usa de forma segura para hilos.

Una clase [ComVisible] .NET se registrará como "Ambos", lo que indica que está bien que se utilice en una secuencia en el MTA. Bastante optimista, pero sigue la filosofía de .NET de que todo es inseguro, pero se puede poner seguro colocando la palabra clave lock en los lugares correctos. Una promesa que a menudo no es probada por cierto, arriesgada. Anular el valor de ThreadingModel (u omitirlo) requiere escribir código para registrar el coclass usted mismo, decorado con el atributo [ComRegisterFunction]. RegistrationServices.RegisterTypeForComClients() puede ser útil para colocar las claves básicas en su lugar.

+2

Creo que el OP no está hablando de los atributos de MIDL. http://msdn.microsoft.com/de-de/library/zfbxt3zs.aspx – Henrik

+0

Tienes razón. No cambia mi respuesta. –

+0

Acabo de comprobar el registro y el valor actual de ThreadingModel es "Ambos", que no es el que estoy buscando. ¿No hay otra forma de configurar el ThreadingModel además de registrar manualmente las clases COM usando un método marcado con [ComRegisterFunction]? – Xperimental

Cuestiones relacionadas