visual studio questions microsoft exam español descargar community c# winforms process

c# - questions - visual studio community



Aplicación Windows Forms como Google Chrome con múltiples procesos (7)

¿Hay alguna forma de usar C # para crear una aplicación contenedor donde cada pestaña sea en realidad su propio proceso, como con Google Chrome?


Revisa esta publicación en el Blog de Chromium. Solo un proceso es responsable de la representación real en la pantalla.


Sin mirar demasiado profundo en la pila de extensibilidad, puede usar el espacio de nombres System.Addin para crear una aplicación que inherentemente puede crear complementos como pestañas individuales visuales y establecer cada pestaña / complemento como un proceso de salida y este es un comportamiento listo para usar.

Tendrá la misma funcionalidad que las pestañas de Chrome.


Mi producto, WindowTabs.com , hace algo así. Necesita usar Win32: le sugiero que evite usar SetParent porque termina adjuntando la entrada de hilo. En su lugar, dibuje las pestañas sobre las ventanas y use SetWindowPos para mover las ventanas como un grupo. Además, algunos controles de terceros como Infragistic no funcionan correctamente si cría el formulario en un nivel Win32.


Las API System.AddIn introducidas en .NET 3.5 le permiten usar controles de interfaz de usuario en diferentes AppDomains . Con algunos saltos en el aro, puedes hacer que funcione en procesos separados, también.

Esto es soportado de manera exploratoria en WPF. Ver el complemento de muestra de MSDN Devuelve una UI .

Al usar Windows Forms, parece que no es posible de manera nativa con las API de System.AddIn. Vea esta publicación de un arquitecto de System.AddIn, Jack Gudenkauf.

Sin embargo, hay una solución para WinForms. Puede hacer que esto funcione con un pequeño truco: consulte el blog del equipo BCL. Soporte para formularios Windows Forms en System.AddIn Hosts y complementos.


Puede usar la llamada SetParent Win32 para hacer esto, pero está lleno de problemas. Tuve suficientes problemas para hacer que todo funcionara bien usando ventanas de diferentes AppDomains. Habría incluso más dificultades con procesos extra completos.

Básicamente, se requiere mucha comunicación entre los dos procesos; cosas como cambiar el tamaño pueden ser bastante dolorosas, así como lo que sucede si la aplicación hija quiere dejarlo, etc. Todo es factible, pero lo pensaría cuidadosamente antes de hacerlo. Para un navegador tiene mucho sentido (descargo de responsabilidad: trabajo para Google), pero para la mayoría de las demás aplicaciones no vale la pena el esfuerzo.

(¿Son las "pestañas" que desea crear aplicaciones .NET reales? De ser así, como digo, esto se vuelve significativamente más fácil, y puedo darle una gran pista, que es que cada UI debe ejecutar su propio hilo de interfaz de usuario dentro de su propio AppDomain ¡Obtienes efectos realmente extraños si no haces esto!)


Para aquellos que estén interesados ​​en la implementación real de las aplicaciones multiproceso, escribí un artículo al respecto en mi sitio web: aplicación C-multiprocesador como Google Chrome .

He incluido el código de trabajo C #. Se ha probado que funciona con .NET 2.0, .NET 3.0 y .NET 3.5.

Canalizaciones con nombre: cómo se comunican los procesos entre sí

Debido a que su pregunta se realizó específicamente sobre Google Chrome, debe saber que Chrome usa canalizaciones con nombre para comunicarse entre procesos.

En el código fuente de C # que mencioné anteriormente hay 2 archivos: PipeServer.cs y PipeClient.cs. Estos 2 archivos son envoltorios delgados de la API de Windows de Named Pipes. Está bien probado porque cientos de miles de personas usan nuestros productos. Entonces la estabilidad y la solidez eran un requisito.

Cómo utilizamos el diseño multiproceso

Ahora que tienes todas las piezas del rompecabezas, déjame decirte cómo utilizamos el diseño multiproceso en nuestra aplicación.

Nuestro producto es una solución de actualización completa. Es decir, hay un programa que crea parches de actualización (no relevantes para la discusión), un programa de actualización independiente ( wyUpdate, también de código abierto ) y un control de actualización automático que nuestros usuarios ponen en sus formularios C # o VB.NET.

Utilizamos conductos con nombre para comunicarnos entre el actualizador independiente (wyUpdate) y el control Actualizador automático que se encuentra en el formulario de su programa. wyUpdate informa el progreso al Actualizador automático, y el Actualizador automático puede indicarle a wyUpdate que cancele el progreso, comience la descarga, comience a extraer, etc.

De hecho, el código exacto de las tuberías con nombre que utilizamos está incluido en el artículo que mencioné anteriormente: aplicación C-multiprocesador como Google Chrome .

Por qué no deberías usar el diseño multiproceso

Como Jon Skeet mencionó anteriormente, debe tener una necesidad específica para el modelo multiproceso. En nuestro caso, queríamos mantener el programa de actualización completamente separado de su programa. De esta forma, si el programa de actualización se cuelga de alguna manera, su programa permanecerá intacto. Tampoco queríamos duplicar nuestro código en 2 lugares.

Dicho esto, incluso con nuestro envoltorio Named Pipes bien probado, la comunicación entre procesos es difícil. Así que pise con cuidado.


Sí. Puede generar nuevos procesos utilizando System.Diagnostics.Process . Usando alguna forma de comunicación entre procesos (IPC), .NET Remoting por ejemplo, puede comunicarse entre procesos. Y luego puede configurar el elemento principal de la ventana / formulario de su nuevo proceso en una ventana (pestaña) de su primer proceso para que aparezca allí.