Этот пост предназначен как расширение для ответа @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 автоматически отключается в этих контекстах.
[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 отладчик, начинающий мой процесс в объекте задания?