Ця публікація призначена як доповнення до відповіді @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 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] Тому я ще цього не перевіряв, але думаю, що це безумство закінчиться зараз, якщо ви просто включите маніфест із підтримуваною інформацієюOS.
Порада 1 : Якщо ви розробляєте додаток .NET з Visual Studio, як я, тут [4] є кілька приємних інструкцій щодо налаштування маніфесту програми.
Порада 2 : Будьте уважні до запуску програми з Visual Studio. Я виявив, що, додавши відповідний маніфест, у мене все-таки виникли проблеми з PCA при запуску з Visual Studio, навіть якщо я використовував Start без налагодження. Однак запуск моєї програми від Explorer працював. Після вручну додавання 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-jer-we-change-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, починаючи мій процес в об'єкті роботи?