2009-11-18 878 views
9

Actualmente tengo una biblioteca de clases .NET escrita en C# que expone su funcionalidad a través de COM a un programa C++ (pre.NET).Creación de un servidor de automatización COM en C#

Ahora queremos mover la biblioteca fuera del proceso para liberar espacio de direcciones en la aplicación principal (es una aplicación de procesamiento de imágenes, y las imágenes grandes se comen el espacio de direcciones). Recuerdo en mis días de VB6 que se podía crear un "servidor de automatización OLE". El SO se iniciará automáticamente y detendrá el .exe del servidor a medida que se crean/destruyen los objetos. Esto parece ser el ajuste perfecto para nosotros: por lo que puedo ver, nada cambiaría en el cliente, excepto que llamaría a CoCreateInstance con CLSCTX_LOCAL_SERVER en lugar de CLSCTX_INPROC_SERVER.

¿Cómo crearía un servidor fuera de proceso en C#? ¡O no hay información en línea al respecto, o mi terminología está desactualizada/desactualizada!

+0

llegué a la conclusión en un momento que esto no fue apoyada, pero no he He visto eso explícitamente declarado en cualquier lugar. He intentado intercalar en CoRegisterClassObject para registrar una fábrica para un objeto COM de C#, pero nunca lo hice funcionar. ¡Curioso si alguien más ha tenido suerte! –

+0

Consulte mi respuesta aquí: http://stackoverflow.com/questions/24724784/com-interop-with-ipc-inc-c-sharp/24732010#24732010 –

Respuesta

6

En realidad, se puede hacer esto en .NET (lo he hecho antes como una prueba de concepto), pero es un poco trabajo para que todo funcione correctamente (duración del proceso, registro, etc.).

Crea una nueva aplicación de Windows. En el método Main, llame a RegistrationServices.RegisterTypeForComClients: este es un contenedor gestionado alrededor de CoRegisterClassObject que se ocupa de la fábrica de clases por usted. Pase el Tipo de la clase ComVisible administrada (la que realmente desea crear, .NET suministra la fábrica de clases automáticamente) junto con RegistrationClassContext.LocalServer y RegistrationConnectionType.SingleUse. Ahora tiene un exe muy básico que puede registrarse como LocalServer32 para la activación de COM. Aún tendrá que calcular la vida útil del proceso (implementar refunciones en los objetos administrados con constructores/finalizadores, cuando llegue a cero, llamar a UnregisterTypeForComClients y salir), no puede dejar que Main salga hasta que todos sus objetos estén muertos.

El registro no es demasiado malo: cree un método atribuido ComRegisterFunction que agrega una clave LocalServer32 en HKLM \ CLSID (suclsidhere), cuyo valor predeterminado es la ruta a su exe. Ejecute regasm yourexe.exe/codebase/tlb, y listo.

+0

Gracias: resulta que la gestión de por vida no fue un problema : simplemente iniciamos el servidor fuera de proceso cuando se inicia la aplicación principal y lo apagamos cuando finaliza. Entonces, el único truco fue llamar a RegistrationServices.RegisterTypeForComClients, ¡fácil! – Grokys

2

Siempre podría exponer su clase .NET como clases COM utilizando InteropServices y luego configurar la biblioteca como una aplicación COM +. La biblioteca .NET se ejecutará fuera del proceso y será hospedada por una instancia DLLHOST.EXE.

1

Aquí es un artículo de MSDN que cubre todos los aspectos de cómo crear LocalServer COM en C# (.NET): link

Cuestiones relacionadas