Как остановить процесс, который я запускаю из своего приложения, если мое приложение рушится или будет убито вручную [дублировать]

128
задан rahulroy9202 27 November 2014 в 13:09
поделиться

12 ответов

145
ответ дан Mariusz Jamro 25 August 2018 в 06:42
поделиться
0
ответ дан Alexey 25 August 2018 в 06:42
поделиться
2
ответ дан Alsty 25 August 2018 в 06:42
поделиться
41
ответ дан Community 25 August 2018 в 06:42
поделиться
8
ответ дан Giorgi 25 August 2018 в 06:42
поделиться
2
ответ дан Justin Harris 25 August 2018 в 06:42
поделиться
7
ответ дан Marco Regueira 25 August 2018 в 06:42
поделиться
15
ответ дан mbaynton 25 August 2018 в 06:42
поделиться
28
ответ дан Ron 25 August 2018 в 06:42
поделиться
1
ответ дан Thomas Maierhofer 25 August 2018 в 06:42
поделиться

Этот пост предназначен как расширение для ответа @Matt Howells, особенно для тех, кто сталкивается с проблемами с использованием объектов Job в Vista или Win7, особенно если вы получаете ошибку отказа в доступе («5») при вызове AssignProcessToJobObject.

tl; dr

Чтобы обеспечить совместимость с Vista и Win7, добавьте следующий манифест в родительский процесс .NET:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
    <v3:security>
      <v3:requestedPrivileges>
        <v3:requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </v3:requestedPrivileges>
    </v3:security>
  </v3:trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <!-- We specify these, in addition to the UAC above, so we avoid Program Compatibility Assistant in Vista and Win7 -->
    <!-- We try to avoid PCA so we can use Windows Job Objects -->
    <!-- See https://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed -->

    <application>
      <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
    </application>
  </compatibility>
</assembly>

Обратите внимание, что когда вы добавьте новый манифест в Visual Studio 2012, он будет содержать вышеприведенный фрагмент, поэтому вам не нужно его копировать из прослушивания. Он также будет содержать узел для Windows 8.

полное объяснение

Ваша ассоциация заданий завершится неудачей с ошибкой отказа в доступе, если процесс, который вы запускаете, уже связан с другим заданием. Войдите в помощник по совместимости программ, который, начиная с Windows Vista, назначит все виды процессов для своих собственных заданий.

В Vista вы можете пометить приложение, которое будет исключено из PCA, просто включив манифест приложения. Visual Studio, похоже, делает это для приложений .NET автоматически, поэтому вы в порядке.

Простой манифест больше не сокращает его в Win7. [1] Там вам нужно конкретно указать, что вы совместимы с Win7 с тегом в манифесте. [2]

Это заставило меня беспокоиться о Windows 8. Должен ли я снова изменить свой манифест? Видимо, в облаках наблюдается перерыв, поскольку Windows 8 теперь позволяет процессу принадлежать к нескольким заданиям. [3] Так что я еще не тестировал его, но я думаю, что это безумие закончится, если вы просто включите манифест с информацией supportedOS.

Совет 1: Если вы разрабатываете. NET с Visual Studio, как я был здесь, [4], есть несколько полезных инструкций о том, как настроить манифест приложения.

Совет 2: Будьте осторожны при запуске приложения из Visual Studio. Я обнаружил, что после добавления соответствующего манифеста у меня все еще были проблемы с PCA при запуске из Visual Studio, даже если я использовал «Старт без отладки». Однако запуск моего приложения из Explorer. После ручного добавления devenv для исключения из PCA с помощью реестра запускаются также приложения, в которых использовались объекты Job from from VS. [5]

Совет 3: Если вы когда-нибудь захотите узнать, является ли ваша проблема PCA, попробуйте запустить приложение из командной строки или скопируйте программу на сетевой диск и запустите ее оттуда. PCA автоматически отключается в этих контекстах.

[1] http://blogs.msdn.com/b/cjacks/archive/2009/06/18/pca-changes-for-windows -7-how-to-tell-us-you-are-not-an-installer-take-2-потому-we-changed-the-rules-on-you.aspx

[2] http://ayende.com/blog/4360/how-to-opt-out-of-program-compatibility-assistant

[3] ] http://msdn.microsoft.com/en-us/library/windows/desktop/ms681949 (v = vs.85) .aspx : «Процесс может быть связан с более чем одним заданием в Windows 8 "

[4] Как вставить манифест приложения в приложение с помощью VS2008?

[5] Как остановить Visual Studio отладчик, начинающий мой процесс в объекте задания?

41
ответ дан Community 9 October 2018 в 00:00
поделиться
  • 1
    Это отличные дополнения к этой теме, спасибо! Я использовал каждый аспект этого ответа, включая ссылки. – Johnny Kauffman 11 August 2014 в 18:51
0
ответ дан Lenor 7 November 2018 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: