Ten post ma na celu rozszerzenie odpowiedzi @Matt Howells, szczególnie dla tych, którzy mają problemy z używaniem Job Objects pod Vista lub Win7 , zwłaszcza jeśli otrzymujesz błąd odmowy dostępu ('5') podczas wywoływania AssignProcessToJobObject.
tl; dr
Aby zapewnić zgodność z systemami Vista i Win7, dodaj następujący manifest do procesu nadrzędnego .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>
Zwróć uwagę, że po dodaniu nowego manifestu w programie Visual Studio 2012 będzie on już zawierał powyższy fragment, więc nie musisz go kopiować z funkcji Hear. Będzie również zawierał węzeł dla systemu Windows 8.
pełne wyjaśnienie
Twoje powiązanie zadania zakończy się niepowodzeniem i zostanie wyświetlony błąd odmowy dostępu, jeśli uruchamiany proces jest już powiązany z innym zadaniem. Wejdź do Asystenta zgodności programów, który począwszy od systemu Windows Vista przypisze wszystkie rodzaje procesów do własnych zadań.
W systemie Vista możesz oznaczyć swoją aplikację jako wykluczoną z PCA, po prostu dołączając manifest aplikacji. Wydaje się, że Visual Studio robi to automatycznie dla aplikacji .NET, więc wszystko w porządku.
Prosty manifest nie działa już w systemie Win7. [1] Tam musisz konkretnie określić, że jesteś kompatybilny z Win7 za pomocą tagu w swoim manifeście. [2]
To spowodowało, że zacząłem martwić się systemem Windows 8. Czy będę musiał ponownie zmienić manifest? Najwyraźniej w chmurach jest przerwa, ponieważ Windows 8 pozwala teraz na przynależność procesu do wielu zadań. [3] Więc jeszcze tego nie testowałem, ale wyobrażam sobie, że to szaleństwo minie, jeśli po prostu dołączysz manifest z informacjami o obsługiwanym systemie operacyjnym.
Wskazówka 1 : Jeśli tworzysz aplikację .NET w Visual Studio, tak jak ja, tutaj [4] znajdziesz kilka przydatnych instrukcji, jak dostosować manifest aplikacji.
Porada 2 : Zachowaj ostrożność podczas uruchamiania aplikacji z programu Visual Studio. Stwierdziłem, że po dodaniu odpowiedniego manifestu nadal miałem problemy z PCA podczas uruchamiania z Visual Studio, nawet jeśli użyłem Start bez debugowania. Uruchomienie mojej aplikacji z Eksploratora zadziałało jednak. Po ręcznym dodaniu devenv w celu wykluczenia z PCA przy użyciu rejestru, zaczęło działać również uruchamianie aplikacji korzystających z obiektów zadań z VS. [5]
Wskazówka 3 : Jeśli kiedykolwiek chcesz wiedzieć, czy problem dotyczy PCA, spróbuj uruchomić aplikację z wiersza poleceń lub skopiuj program na dysk sieciowy i uruchom go stamtąd. W tych kontekstach PCA jest automatycznie wyłączane.
[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-ponieważ-zmieniliśmy-zasady-na-ciebie.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 : „Proces może być powiązany z więcej niż jednym zadaniem w systemie Windows 8”
[4] Jak mogę osadzić manifest aplikacji w aplikacji przy użyciu VS2008?
[5] Jak zatrzymać debuger programu Visual Studio, uruchamiając mój proces w obiekcie zadania?