Этот пост предназначен для расширения ответа @Matt Howells, особенно для тех, кто сталкивается с проблемами при использовании объектов заданий в Vista или Win7 , особенно если вы получаете сообщение об ошибке отказа в доступе ('5 ') при вызове AssignProcessToJobObject.
Т.Л., др
Чтобы обеспечить совместимость с 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 /3061010/ubit-dochernii-protsess-kogda-roditelskii-protsess-ubit -->
<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] Так что я еще не проверял это, но я думаю, что это безумие закончится, если вы просто включите манифест с информацией о поддерживаемых ОС.
Совет 1 : Если вы разрабатываете приложение .NET с Visual Studio, как я, здесь [4] приведены несколько хороших инструкций по настройке манифеста вашего приложения.
Совет 2 : будьте осторожны с запуском приложения из Visual Studio. Я обнаружил, что после добавления соответствующего манифеста у меня все еще были проблемы с PCA при запуске из Visual Studio, даже если я использовал Пуск без отладки. Однако запуск приложения из Проводника сработал. После добавления devenv вручную для исключения из PCA с использованием реестра, также начали работать приложения, использующие Job Objects из 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-because-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, запускающий мой процесс в объекте задания?