Cet article est conçu comme une extension de la réponse de @Matt Howells, en particulier pour ceux qui rencontrent des problèmes avec l'utilisation des objets de travail sous Vista ou Win7 , en particulier si vous obtenez une erreur d'accès refusé ('5') lors de l'appel à AssignProcessToJobObject.
tl; dr
Pour garantir la compatibilité avec Vista et Win7, ajoutez le manifeste suivant au processus parent .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>
Notez que lorsque vous ajoutez un nouveau manifeste dans Visual Studio 2012, il contient déjà l'extrait de code ci-dessus, vous n'avez donc pas besoin de le copier à partir de hear. Il comprendra également un nœud pour Windows 8.
explication complète
Votre association de travail échouera avec une erreur d'accès refusé si le processus que vous démarrez est déjà associé à un autre travail. Entrez l'assistant de compatibilité des programmes, qui, à partir de Windows Vista, attribuera toutes sortes de processus à ses propres travaux.
Dans Vista, vous pouvez marquer votre application comme étant exclue de PCA en incluant simplement un manifeste d'application. Visual Studio semble faire cela automatiquement pour les applications .NET, donc tout va bien.
Un simple manifeste ne le coupe plus dans Win7. [1] Là, vous devez spécifier spécifiquement que vous êtes compatible avec Win7 avec la balise dans votre manifeste. [2]
Cela m'a amené à m'inquiéter pour Windows 8. Dois-je à nouveau changer mon manifeste? Apparemment, il y a une rupture dans les nuages, car Windows 8 permet désormais à un processus d'appartenir à plusieurs tâches. [3] Je ne l'ai donc pas encore testé, mais j'imagine que cette folie sera terminée maintenant si vous incluez simplement un manifeste avec les informations prises en charge par OS.
Astuce 1 : Si vous développez une application .NET avec Visual Studio, comme je l'étais, voici [4] quelques instructions intéressantes sur la façon de personnaliser votre manifeste d'application.
Astuce 2 : Soyez prudent lorsque vous lancez votre application à partir de Visual Studio. J'ai constaté qu'après avoir ajouté le manifeste approprié, j'avais toujours des problèmes avec PCA lors du lancement à partir de Visual Studio, même si j'utilisais Démarrer sans débogage. Le lancement de mon application depuis Explorer a cependant fonctionné. Après avoir ajouté manuellement devenv pour l'exclusion de PCA à l'aide du registre, le démarrage des applications utilisant des objets de travail de VS a également commencé à fonctionner. [5]
Astuce 3 : Si vous voulez savoir si PCA est votre problème, essayez de lancer votre application à partir de la ligne de commande ou copiez le programme sur un lecteur réseau et exécutez-le à partir de là. PCA est automatiquement désactivé dans ces contextes.
[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-car-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 : "Un processus peut être associé à plus d'un travail dans Windows 8"
[4] Comment puis-je intégrer un manifeste d'application dans une application à l'aide de VS2008?
[5] Comment arrêter le débogueur Visual Studio en démarrant mon processus dans un objet de travail?