2011-09-21 7 views
5

Estoy buscando mostrar la ventana (WPF) que se define en un proyecto de biblioteca de clases separado como un nuevo proceso por separado. ¿Hay alguna manera de hacer esto?cómo iniciar una nueva instancia del segundo proyecto en un nuevo proceso

necesito para iniciar la segunda instancia del proyecto en nuevo proceso, porque no se quedan de memoria ocupado cuando iniciarlo haciendo de esta manera:

secondProject.WPFWindow win = new secondProject.WPFWindow(); 
win.Show(); 

tengo una solución con varios proyectos.

  • StartUp project es la aplicación WPF, tipo de salida: aplicación de Windows (archivo exe).
  • Todos los demás proyectos son de la aplicación WFP, tipo de salida: Biblioteca de clases (archivo dll).

Ahora estoy corriendo "aplicaciones" (otros proyectos en ésta solución construida como DLL) de este código:

secondProject.WPFWindow win = new secondProject.WPFWindow(); 
win.Show(); 

lo que quiero es que las aplicaciones en runnig nuevo proceso ... Normalmente lo haría use Process.Start(), pero no puedo es este caso porque necesita un archivo exe como agrument y tengo (y quiero) archivos DLL.

+1

¿Puedes explicarnos qué es el 2º proyecto? –

+1

Agregue más detalles, incluso si el inglés no es sorprendente haremos lo mejor para usted – Coops

+0

Está tratando de iniciar la segunda aplicación dentro de la otra aplicación, ¿es correcto? – Keeano

Respuesta

3

Puede pasar argumentos de línea de comando al .exe principal para indicarle cuál de las 'subaplicaciones' se debe ejecutar. Entonces el .exe principal puede simplemente lanzarse en un nuevo proceso y decirle a la nueva instancia qué sub-aplicación ejecutar. Por ejemplo, en la principal aplicación .exe, poner la lógica como este en su clase de aplicación:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     //See if exactly one command line argument was passed 
     if (e.Args.Length == 1) 
     { 
      //See if the argument is one of our 'known' values 
      switch (e.Args[0]) 
      { 
       case "launchApp2": 
        secondProject.WPFWindow win2 = new secondProject.WPFWindow(); 
        win2.Show(); 
        break; 
       case "launchApp3": 
        thirdProject.OtherWPFWindow win3 = new thirdProject.OtherWPFWindow(); 
        win3.Show(); 
        break; 
      } 
     } 

     //Probably want to call the base class always? 
     base.OnStartup(e); 
    } 
} 

Entonces cualquier momento que desee poner en marcha uno de los sub-aplicación en un nuevo proceso, puede hacerlo de esta manera:

public void LaunchApp2() 
{ 
    //Start a new process that is ourself and pass a command line parameter to tell 
    // that new instance to launch App2 
    Process.Start(Assembly.GetEntryAssembly().Location, "launchApp2"); 
} 
+0

¡Genial! Podría ser eso lo que estoy buscando :) Lo probaré lo antes posible y se lo haré saber. – DefinitionHigh

+0

¡Muchas gracias! ¡Eso es todo! :) BTW No me gusta llamar a la clase base siempre. – DefinitionHigh

+0

Y, por favor, ¿puedo marcar este proceso de alguna manera? por ejemplo, al configurar la descripción del proceso? Me gustaría prever varias instancias del mismo proyecto. – DefinitionHigh

0

Supongamos que tiene una solución con 2 proyectos: un proyecto se compila en una aplicación (EXE), mientras que el segundo se compila en una biblioteca de clases (DLL). Supongo que la DLL tiene algún tipo definido (por ejemplo, una ventana) que desea iniciar desde el EXE.

La forma más sencilla de hacerlo es simplemente agregar una referencia a la DLL. Haga clic con el botón derecho en el proyecto EXE en el Explorador de soluciones y elija Agregar referencia .... Espere un minuto mientras se abre el cuadro de diálogo. Desde la pestaña Proyectos, seleccione el proyecto DLL. Haga clic en Aceptar.

Ahora, en su proyecto EXE, WPFWindow estará disponible como un tipo importado. Es necesario añadir un

using secondProject;

a la parte superior de cada archivo de código que utiliza WPFWindow. Normalmente hago esto automáticamente usando el atajo de teclado CTRL + Period.

El método que he descrito es el método estándar para usar DLL en C#. Usted puede cargarlos manualmente, pero eso es un poco más complejo, y probablemente no es lo que desea hacer.

Editar:

Alexei es correcta. Creo que lo que tenemos aquí es un XY Problem. Lo que intenta hacer es probablemente muy fácil, pero el enfoque (instanciar una ventana definida en una DLL) no lo es.

Tenga en cuenta que cualquier código que ejecute (en su caso, su WPFWindow) tiene que originarse desde una aplicación, incluso si el código está definido en una DLL. Una DLL por sí misma normalmente no proporciona información al sistema operativo acerca de cómo ejecutar cualquiera de los códigos contenidos dentro.

Considere la posibilidad de agregar otro proyecto EXE que ejecute WPFWindow al que llama usando Process.Sin embargo, esta sugerencia puede ser incorrecta, ya que aún no sabemos cuál es su objetivo final. Estás preguntando "¿Cómo agito mis alas como un pájaro?" cuando la pregunta correcta podría ser "¿Cómo compro un boleto de avión?"

+1

Ya estaba hecho. SÉ CÓMO EJECUTAR LA APLICACIÓN desde el proyecto 2. Está hecho por este código: secondProject.WPFWindow win = new secondProject.WPFWindow(); win.Show(); ¿Alguien puede entender que estoy encontrando la forma de ejecutarlo en PROCESO NUEVO? – DefinitionHigh

Cuestiones relacionadas