2011-11-12 7 views
5

Estoy trabajando en una solución en Visual Studio 2010 Ultimate que contiene dos proyectos C#: un proyecto Forms y un proyecto de consola. Programáticamente, están completamente separados; la parte principal de ambos proyectos podría ejecutarse sin la otra. Lo que me gustaría hacer es invocar la aplicación de la consola presionando un botón en la aplicación Formularios, con ciertas opciones establecidas en base a la aplicación Formularios. Entonces, puede pensar en la aplicación Formularios básicamente como una aplicación 'iniciadora'.Invocación de un segundo proyecto de Visual Studio programáticamente

La forma en que lo he implementado ahora es usando System.Diagnostics.Process.Start con "cmd" como el primer parámetro y la ruta al ejecutable de la aplicación de la consola (más argumentos CLI) como el segundo parámetro. Pero esta es una solución terrible, porque se romperá cuando se despliegue a otras máquinas con un instalador.

También he intentado crear una referencia al proyecto de consola en los Formularios de objeto, haciendo Program en público el proyecto de la consola y estática, y llamando al método Main del proyecto de consola, sino porque no hay mango salida válida, lo que finalmente provoca una excepción que se arrojará.

He hecho muchas búsquedas en Google, algunas buscando aquí en SO, e incluso he comprobado las 'Preguntas similares' en la página de envío, y nadie parece saber cómo hacer lo que quiero hacer. ¿Alguna sugerencia que pueda ponerme en el camino correcto?

FYI: Sé que probablemente haya diez millones de formas mejores de hacerlo, pero tengo varias razones para querer y necesitarlo de esta manera. Sé que podría hacer una GUI separada para el programa CLI y copiar el código relevante, o combinar todo en un proyecto y hacer una ventana de salida separada, o varias otras soluciones como esas. Pero necesito esta solución por dos razones: (1) tenía un programa CLI bastante complejo que funciona bien como un programa CLI, y ahora necesito una forma fácil de usar para iniciarlo, y (2) resolver el problema de otras maneras no lo hace Responda la pregunta de "¿Por qué molestarse en tener varios proyectos ejecutables en la misma solución en primer lugar si no puede invocar uno de los otros?"

Respuesta

5

La forma en que lo hace está bien, solo necesita un poco de ajuste.

En primer lugar, cuando ejecute, no ejecute cmd con su ejecutable como parámetro, ejecute la aplicación de consola myapp.exe directamente como el comando para ejecutar en Process.Start.

El siguiente paso es hacer que la aplicación se ejecute desde donde se instaló. El enfoque más fácil es simplemente implementar ambos ejecutables uno al lado del otro en la misma carpeta. Use Application.StartupPath para encontrar la carpeta desde la que se inició su aplicación Forms (y, por lo tanto, donde reside la otra aplicación). Use Path.Combine(Path.GetDirectory(Application.StartupPath), "myapp.exe") para generar la ruta completa del exe para ejecutar.

Otra opción es usar un instalador que pueda almacenar la ubicación de la otra aplicación en un lugar conocido (por ejemplo, una clave de registro), pero esa es una complejidad más grande con poca ganancia (a menos que necesite el instalador por otras razones)

+0

¡Ack! ¿Por qué Microsoft no puede facilitar las cosas? Muchas gracias por la respuesta y el consejo. – Mrrvomun

Cuestiones relacionadas