2017-02-19 1 views
0

Ich bin mir nicht sicher, wie diese Frage zu formulieren, also bitte bitte mit mir.Aufrufen einer Main() in einer anderen .exe und Erstellen eines angeschlossenen Konsolenfensters

Ich erstelle eine Sandbox, um .exes mit verschiedenen Berechtigungen auszuführen. Im Grunde baue ich auf das Beispiel in diesem Artikel: https://msdn.microsoft.com/en-us/library/bb763046(v=vs.110).aspx

Vor dem Re-Design, ich bin dabei zu erwähnen, hatte mein Projekt eine Konsolenanwendung Ausgabetyp (Projekt-> Eigenschaften-> Anwendung-> Ausgabetyp) obwohl es hauptsächlich ein WPF-Projekt war. Dies führte dazu, dass sowohl ein Konsolenfenster als auch meine GUI zu Beginn des Programms angezeigt wurden.

Wenn Sie eine Konsolenanwendung in der Sandbox ausführen, wird die Ausgabe in das bereits geöffnete Konsolenfenster geschrieben und nicht ein weiteres mit der zu testenden EXE verknüpft. Ich versuche, dies zu vermeiden, und würde meinen Ausgabetyp lieber als Windows-Anwendung behalten, um zu verhindern, dass ein unnötiges Konsolenfenster geöffnet wird.

Soweit ich sagen kann, ist die Ausgabe von dieser Codezeile stammt:

target.EntryPoint.Invoke(null, parameters);

Dies führt die Main(string[] args) Methode in meinem Exe unter Test, aber es nicht seine eigene Konsole laichen Fenster und Fehler folgen schnell. Gibt es eine Möglichkeit, ein Konsolenfenster zu erstellen und den erstellten Prozess anzuhängen?

Danke, Änderungen und Fragen willkommen

P. S. Wenn der Ausgabetyp auf eine Konsolenanwendung eingestellt ist, laden andere Ausgabetypen (z. B. Formulare und WPF-Projekte) ihre jeweiligen GUIs vollkommen in Ordnung.

+1

kann ein Prozess nur ein Konsolenfenster haben. Das musst du in deinem Design berücksichtigen. –

Antwort

0

Die Antwort auf mein Problem beinhaltet die Verwendung von pInvoke, um einige der Kernal32 API zu verwenden. Addiert man diese DLLImports:

[DllImport("kernel32.dll")] static extern int AllocConsole(); [DllImport("kernel32.dll")] static extern int FreeConsole();

Diese erlauben Sie mir eine Konsole ein Verfahren zuzuteilen ich bin zu starten und ich kann mein Projekt als Windows-Anwendung verlassen. Alles, was passieren muss, ist, meinen Aufruf zwischen Alloc und Free einzuschließen.

Als solche:

AllocConsole(); 

var trythis = target.EntryPoint.Invoke(null, parameters); 

FreeConsole(); 
Verwandte Themen