Запуск приложения как потока, а не процесса - PullRequest
1 голос
/ 16 июля 2010

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

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

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

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

1 Ответ

2 голосов
/ 17 июля 2010

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

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

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


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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...