¿Cómo forzar el aislamiento del proceso para un servidor COM fuera de proceso?
interop automation (3)
Estoy escribiendo código administrado que tiene que interactuar con el servidor de automatización COM de un proveedor que se queda sin proceso. Descubrí que este servidor se vuelve inestable si más de un cliente se conecta a él. Por ejemplo, si tengo el código administrado en el proceso A y el código administrado en el proceso B conectando ambos a este servidor COM, se generará un único proceso para el servidor COM y su comportamiento es menos confiable. Espero que haya una forma de forzar un proceso separado para cada conexión cliente-servidor . Idealmente, me gustaría terminar con:
Proceso gestionado A hablando con el servidor COM en proceso C1
Proceso gestionado B hablando con el servidor COM en proceso C2
Un pensamiento que me vino a la mente fue que si ejecutaba el proceso A y el proceso B con diferentes identidades de seguridad, eso podría causar que la infraestructura COM creara procesos de servidor por separado. Preferiría no seguir por ese camino, sin embargo. El Proceso gestionado A y el Proceso gestionado B son en realidad Servicios de Windows. Y los estoy ejecutando con el sistema local de identidad (porque los necesito para poder interactuar con el escritorio, y no se puede marcar la casilla "Interactuar con el escritorio" en el applet de servicios para los servicios que no se ejecutan como locales Sistema). Y la razón por la que necesito interactuar con el escritorio es que este servidor COM de vez en cuando arroja un cuadro de diálogo en la pantalla y si el servicio en sí no puede interactuar con el escritorio, el servidor COM se genera y no puede mostrar el diálogo (creo que es mostrado en una WinStation oculta).
Ha pasado un tiempo desde que hice esto, así que mi memoria es borrosa.
Si configura el servidor OOP COM como servidor DCOM utilizando la herramienta de configuración DCOM, creo que puede especificar el nivel de aislamiento. Lo hice hace años con un DLL en proceso no seguro de hilos que necesitaba ser accedido de forma segura para hilos de IIS y funcionaba con encanto.
Avísame si te funciona :)
Su mejor opción sería conseguir que el proveedor arregle el componente. Después de todo, si no maneja varios clientes, podría haber otros errores al acecho. Si no puede hacer esto, hay otras cosas que debe intentar.
Con los objetos COM en proceso, he tenido la oportunidad de cargar manualmente el dll y acceder a las interfaces directamente sin pasar por COM.
No he hecho esto yo mismo con COM fuera de proceso, pero hay algunas cosas que puedes probar. En definitiva, la biblioteca es solo un proceso sentado allí recibiendo mensajes que invocan funciones.
Es posible que pueda iniciar manualmente una nueva copia del proceso para cada cliente y luego enviarle mensajes. Puede encontrarse con algo de hipo con esto. Por ejemplo, el proceso puede verificar si ya se está ejecutando y rehusarse a iniciar o ser infeliz.
Si tiene un límite superior conocido sobre el número de clientes, otro enfoque que podría considerar sería hacer varias copias del archivo .exe original y luego usar el parche binario (algo similar a la biblioteca de desvíos de Microsoft Research) para anular el COM funciones de registro y registrar cada copia como un objeto COM separado.
Coloque el componente registrado en COM +, esto pone una capa de aislamiento en su.
Uso: Panel de control-> Herramientas administrativas
o cmd / ejecutar DCOMCNFG
Servicios de componentes-> Computadoras-> Mi PC-> Aplicación COM +, haga clic con el botón secundario, nueva aplicación, luego, Crear una aplicación vacía, ingrese el nombre de la aplicación "COM + your.dll", luego, seleccione Servicio local, siguiente, siguiente, siguiente, finalice .
En el nuevo elemento creado, expanda, en Componentes, haga clic con el botón secundario, nuevo componente, luego, seleccione Instalar nuevo componente, seleccione su componente.
Haga clic en Propiedades del componente, pestaña Identidad, seleccione Cuenta del sistema.
Para errores en llamadas ver Evento después.