Запуск приложения как потока, а не процесса

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

В качестве дополнения к этому вопросу, я думаю, у меня есть теория о том, как я могу это сделать, чтобы достичь того, что я пытаюсь сделать. Во-первых, позвольте мне сказать, что причина, по которой я это делаю, заключается в том, что я пытаюсь создать тестовое приложение, которое может «тестировать» другие приложения, но контролировать их, поэтому, если они получают исключение, мое тестовое приложение может завершить поток. и перезапустите его автоматически.

Моя теория о том, как это сделать, состоит в том, чтобы создать интерфейс, называемый, например, ITestBed, и реализовать его в основном классе моего приложения. Реализация будет содержать один метод, например, TestApp(). Все, что мне нужно сделать из моего тестового приложения, это вызвать этот метод, и этот метод на стороне приложения может просто отражать конструктор моего текущего объекта? Будет ли это работать?

По сути, я пытаюсь имитировать работу Visual Studio. Если вы установили точку останова в своей программе, нажмите, чтобы запустить приложение в Visual Studio, ваше приложение запускается как дочерний элемент приложения Visual Studio. Чтобы проверить это, вы можете завершить приложение Visual Studio, и ваше приложение также завершится. Как я могу этого добиться?


person Icemanind    schedule 16.07.2010    source источник
comment
возможный дубликат Выполнение программы как потока и не как процесс   -  person Henk Holterman    schedule 17.07.2010
comment
Вы изобретаете колесо. Хотя бы взгляните на исходный код NUnit: launchpad.net/nunitv2/2.5/2.5.5/+download/   -  person Hans Passant    schedule 17.07.2010
comment
@HansPassant При всем уважении, сэр: если вы не заметили, мир движется благодаря колесам (самолеты, автомобили, велосипеды, скейтборды...): P.   -  person SE13013    schedule 26.07.2015


Ответы (1)


Вам не нужно запускать его как отдельный поток.

При использовании Process.Start для запуска процесс, это дочерний процесс текущего приложения.

Просто следите за событием Process.Exited. (убедитесь, что для параметра EnableRaisingEvents установлено значение true ) и используйте его, чтобы увидеть, когда процесс завершится. Затем вы можете автоматически перезапустить процесс в этот момент.


Моя теория о том, как это сделать, состоит в том, чтобы создать интерфейс, называемый, например, ITestBed, и реализовать его в основном классе моего приложения. Реализация будет содержать один метод, например, TestApp(). Все, что мне нужно сделать из моего тестового приложения, это вызвать этот метод, и этот метод на стороне приложения может просто отражать конструктор моего текущего объекта? Будет ли это работать?

Это сработает. Вы можете загрузить основную сборку исполняемого файла с помощью отражения и создать основной объект, а затем вызвать свой метод. Однако это делает процесс частью вашего текущего приложения, поэтому у него есть некоторые побочные эффекты. В этой ситуации вы разделяете пространство памяти процесса.

Если вы сделаете это, вы можете заглянуть в домены приложений. Загрузив и «запустив» свою реализацию ITestBed в отдельном домене приложения, вы защитите свое основное приложение.

person Reed Copsey    schedule 16.07.2010
comment
Чтобы продолжить ответ Рида: довольно легко написать приложение, которое испортит весь процесс, в котором оно находится (даже если вы изолируете его в AppDomain). Процесс — это правильный объем работы для подобных вещей. Visual Studio использует дочерние процессы, а не потоки, для отладки. - person Stephen Cleary; 17.07.2010