2017-02-19 30 views
0

Я не уверен, как сформулировать этот вопрос, поэтому, пожалуйста, несите меня.Вызов Main() в другом .exe и нерест прикрепленного окна консоли

Я создаю песочницу для запуска .exes с различными привилегиями. В основном я строил пример в этой статье: https://msdn.microsoft.com/en-us/library/bb763046(v=vs.110).aspx

Перед тем как перепроектировать, я собираюсь упомянуть, мой проект имел тип вывода консольного приложения (Project-> Properties-> Application-> Output type), несмотря на то, что в основном это проект WPF. Это привело к тому, что окно консоли и мой графический интерфейс отображались при запуске программы.

При запуске консольного приложения В песочнице вывод будет записан в уже открытое окно консоли, а не для создания другого связанного с тестируемым .exe. Я пытаюсь избежать этого и предпочел бы, чтобы мой тип вывода оставался в виде приложения Windows, чтобы предотвратить открытие ненужного окна консоли.

Насколько я могу судить, этот вопрос вытекает из этой строки кода:

target.EntryPoint.Invoke(null, parameters);

Это запускает метод Main(string[] args) в моем .exe испытуемой, однако он не порождает свою собственную консоль окно и ошибки следуют быстро. Есть ли способ создать консольное окно и прикрепить к нему порожденный процесс?

Спасибо, редактирует и вопросы приветствуются

P.S. Если тип вывода настроен на консольное приложение, другие типы вывода (например, формы и проекты wpf) загружают их соответствующие графические интерфейсы совершенно точно.

+1

Процесс может иметь только одно окно консоли. Вам придётся приспособиться к этому в вашем дизайне. –

ответ

0

Ответ на мою проблему заключается в использовании pInvoke для использования некоторых из kernal32 api. Добавление этих DLLImports:

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

Они позволяют мне выделить консоль к процессу, я собираюсь начать, и я могу оставить свой проект в качестве окна приложения. Все, что должно произойти, - заключить мой вызов между Alloc и Free.

Как таковой:

AllocConsole(); 

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

FreeConsole();