2011-09-21 5 views
5

Sto cercando di mostrare la finestra (WPF) che è definita in un progetto di libreria di classi separato come un nuovo processo separato. C'è un modo per fare questo?come avviare una nuova istanza del secondo progetto nel nuovo processo

ho bisogno per iniziare la seconda istanza progetto nel nuovo processo, perché non stare memoria occupata quando ho avviarlo in questo modo:

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

Ho una soluzione con più progetti.

  • Progetto di avvio è app WPF., Tipo di output: applicazione Windows (file exe).
  • Tutti gli altri progetti sono app WFP., Tipo di output: libreria di classi (file dll).

Ora sto facendo funzionare "applicazioni" (altri progetti in questo un'unica soluzione costruita come DLL) di questo codice:

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

quello che voglio è che le applicazioni runnig a nuovo processo ... Normalmente avrei utilizzare Process.Start(), ma non posso è questo caso perché ha bisogno di file exe come agrument e ho (e voglio) DLL.

+1

puoi spiegare qual è il secondo progetto? –

+1

Si prega di aggiungere ulteriori dettagli anche se l'inglese non è sorprendente, faremo del nostro meglio per voi – Coops

+0

Il vostro tentativo di avviare la seconda app all'interno dell'altra app, è corretto? – Keeano

risposta

3

È possibile passare argomenti della riga di comando all'exe. Principale per indicare quale delle "app secondarie" eseguire. Quindi l'exe principale può solo lanciarsi in un nuovo processo e indicare alla nuova istanza quale subapp da eseguire. Ad esempio, nel principale applicazione exe, mettere la logica come questo nella classe di applicazione:

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); 
    } 
} 

Poi ogni volta che si desidera avviare uno dei sub-app in un nuovo processo, è possibile farlo in questo modo:

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

Ottimo! Potrebbe essere quello che sto cercando :) Lo testerò appena possibile e ti farò sapere. – DefinitionHigh

+0

Grazie mille! Questo è! :) BTW Non ho mai chiamato la classe base wat. – DefinitionHigh

+0

E per favore, posso contrassegnare questo processo in qualche modo? ad esempio impostando la descrizione del processo? Vorrei prevenire più istanze dello stesso progetto .. – DefinitionHigh

0

Supponiamo di avere una soluzione con 2 progetti: un progetto viene compilato in un'applicazione (EXE), mentre il secondo viene compilato in una libreria di classi (DLL). Suppongo che la DLL abbia qualche tipo definito (ad esempio una finestra) che si desidera avviare dall'EXE.

Il modo più semplice per eseguire questa operazione è semplicemente aggiungere un riferimento alla DLL. Fare clic con il tasto destro del mouse sul progetto EXE in Esplora soluzioni e scegliere Aggiungi riferimento .... Attendere un minuto mentre si apre la finestra di dialogo. Dalla scheda Progetti, selezionare il progetto DLL. Clicca OK.

Ora, nel progetto EXE, WPFWindow sarà disponibile come tipo importato. È necessario aggiungere un

using secondProject;

alla parte superiore di ogni file di codice che utilizza WPFWindow. Normalmente lo faccio automaticamente usando la scorciatoia da tastiera CTRL + Periodo.

Il metodo che ho descritto è il metodo standard di utilizzo delle DLL in C#. È possibile caricare manualmente, ma è un po 'più complesso, e probabilmente non è quello che si vuole fare.

Edit:

Alexei è corretto. Penso che quello che abbiamo qui è un XY Problem. Quello che stai cercando di fare è probabilmente molto facile, ma l'approccio (istanziare una finestra definita in una DLL) non lo è.

Tenere presente che qualsiasi codice eseguito (nel proprio caso, il proprio WPFWindow) deve provenire da un'applicazione, anche se il codice stesso è definito in una DLL. Una DLL di per sé normalmente non fornisce alcuna informazione al sistema operativo su come eseguire nel codice all'interno del codice.

Considera di aggiungere un altro progetto EXE che esegue il tuo WPFWindow che chiami utilizzando Process.Questo suggerimento potrebbe essere sbagliato, tuttavia, poiché non sappiamo ancora quale sia il tuo obiettivo finale. Stai chiedendo "Come faccio a sbattere le ali come un uccello?" quando la domanda corretta potrebbe essere "Come posso acquistare un biglietto aereo?"

+1

Era già finito. SO COME ESEGUIRE APP dal progetto 2. È fatto da questo codice: secondProject.WPFWindow win = new secondProject.WPFWindow(); win.Show(); Qualcuno può capire che sto trovando il modo di eseguirlo in NUOVO PROCESSO? – DefinitionHigh

Problemi correlati