2011-04-20 16 views
5

Creé un objeto COM en .NET y lo registré como una aplicación de servidor COM + con Pooling = 1 usando regsvcs. Actualmente estoy buscando un error y, por lo tanto, necesito asegurarme de que este objeto COM se ejecuta en STA, no en MTA. ¿Cómo puedo especificar esto?
Cualquiera de los siguientes me ayudará:Especifique el estado del apartamento que se utilizará al crear instancias fuera del objeto COM de proceso

  • un ajuste en el complemento Servicios de componentes en
  • Un fragmento de configuración/código que hace que el objeto COM para permitir sólo STA y no los dos
  • Un ajuste/fragmento de código en C# en el lado del llamante que le dice a COM + que el objeto COM debe ser inicializado con STA

actualización:
he intentado cambiar manualmente el ThreadingModel entrada en el registro de Both a Apartment. Esto no ayuda tampoco, porque cuando intento crear una instancia del objeto COM, consigo un COMException (0x80110802) y el visor de sucesos dice:

El modelo de hilos del componente especificado en el registro es incompatible con el base de datos de registro. El componente defectuoso es: < MyComponent >

¿Hay algún otro lugar que necesito para cambiar el modelo de hilos? Por ejemplo, en esa "base de datos de registro"? ¿Dónde puedo encontrarlo?

Gracias!

Respuesta

3

OK, inserta el código siguiente en la clase que se expone como objeto COM y parece que funciona:

[ComRegisterFunction] 
private static void Register(Type registerType) 
{ 
    if (registerType != null) 
    { 
     using (RegistryKey clsidKey = Registry.ClassesRoot.OpenSubKey("CLSID")) 
     { 
      using (RegistryKey guidKey = clsidKey.OpenSubKey(registerType.GUID.ToString("B"), true)) 
      { 
       using (RegistryKey inproc = guidKey.OpenSubKey("InprocServer32", true)) 
       { 
        inproc.SetValue("ThreadingModel", "Apartment", RegistryValueKind.String); 
       } 
      } 
     } 
    } 
} 

No entiendo en absoluto , ¿por qué cambiar la ThreadingModel por parte didn 't produce el mismo resultado, pero no me importa ...

+0

No es suficiente, solo funciona si el coclass se registró antes. Considere RegistrationServices.RegisterTypeForComClients() para obtener primero las claves básicas en su lugar. –

Cuestiones relacionadas