Esta publicação pretende ser uma extensão da resposta do @Matt Howells, especificamente para aqueles que têm problemas com o uso de objetos de trabalho no Vista ou no Win7 , especialmente se você receber um erro de acesso negado ('5') ao chamar AssignProcessToJobObject.
tl; dr
Para garantir a compatibilidade com o Vista e o Win7, adicione o seguinte manifesto ao processo pai do .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>
Observe que, quando você adiciona um novo manifesto no Visual Studio 2012, ele já contém o snippet acima, para que você não precise copiá-lo do hear. Também incluirá um nó para o Windows 8.
explicação completa
Sua associação ao trabalho falhará com um erro de acesso negado se o processo que você está iniciando já estiver associado a outro trabalho. Digite o Assistente de Compatibilidade de Programa, que, a partir do Windows Vista, atribuirá todos os tipos de processos a seus próprios trabalhos.
No Vista, você pode marcar seu aplicativo para ser excluído do PCA simplesmente incluindo um manifesto de aplicativo. O Visual Studio parece fazer isso para aplicativos .NET automaticamente, então você está bem.
Um manifesto simples não o corta mais no Win7. [1] Lá, é necessário especificar especificamente que você é compatível com o Win7 com a tag no seu manifesto. [2]
Isso me levou a me preocupar com o Windows 8. Terei que mudar meu manifesto mais uma vez? Aparentemente, há uma quebra nas nuvens, pois o Windows 8 agora permite que um processo pertença a vários trabalhos. [3] Então, ainda não testei, mas imagino que essa loucura acabará agora se você simplesmente incluir um manifesto com as informações suportadas do OS.
Dica 1 : se você está desenvolvendo um aplicativo .NET com o Visual Studio, como eu estava, aqui estão algumas instruções legais sobre como personalizar o manifesto do aplicativo.
Dica 2 : tenha cuidado ao iniciar seu aplicativo no Visual Studio. Descobri que, depois de adicionar o manifesto apropriado, ainda havia problemas com o PCA ao iniciar a partir do Visual Studio, mesmo se eu usasse Iniciar sem Depuração. Iniciar meu aplicativo no Explorer funcionou, no entanto. Após adicionar manualmente o devenv para exclusão do PCA usando o registro, o início de aplicativos que usavam Objetos de Trabalho do VS também começou a funcionar. [5]
Dica 3 : Se você quiser saber se o PCA é seu problema, tente iniciar o aplicativo a partir da linha de comandos ou copie o programa em uma unidade de rede e execute-o a partir daí. O PCA é automaticamente desativado nesses contextos.
[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-porque-mudamos-as-regras-em-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 : "Um processo pode ser associado a mais de um trabalho no Windows 8"
[4] Como posso incorporar um manifesto de aplicativo em um aplicativo usando o VS2008?
[5] Como parar o depurador do Visual Studio que inicia o meu processo em um objeto de trabalho?