Questo post è inteso come un'estensione della risposta di @Matt Howells, in particolare per coloro che incontrano problemi con l'utilizzo di Job Objects in Vista o Win7 , soprattutto se si riceve un errore di accesso negato ('5') quando si chiama AssignProcessToJobObject.
tl; dr
Per garantire la compatibilità con Vista e Win7, aggiungere il seguente manifest al processo padre .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>
Si noti che quando si aggiunge un nuovo manifest in Visual Studio 2012 conterrà già lo snippet sopra indicato, quindi non è necessario copiarlo da hear. Includerà anche un nodo per Windows 8.
spiegazione completa
La tua associazione di lavoro fallirà con un errore di accesso negato se il processo che stai avviando è già associato a un altro lavoro. Immettere Program Compatibility Assistant, che, a partire da Windows Vista, assegnerà tutti i tipi di processi ai propri lavori.
In Vista puoi contrassegnare la tua applicazione come esclusa dal PCA semplicemente includendo un manifest dell'applicazione. Visual Studio sembra farlo automaticamente per le app .NET, quindi stai bene lì.
Un semplice manifest non lo taglia più in Win7. [1] Lì, devi specificare specificamente che sei compatibile con Win7 con il tag nel tuo manifest. [2]
Questo mi ha portato a preoccuparmi di Windows 8. Dovrò cambiare di nuovo il mio manifest? Apparentemente c'è una rottura tra le nuvole, poiché Windows 8 ora consente a un processo di appartenere a più lavori. [3] Quindi non l'ho ancora testato, ma immagino che questa follia finirà ora se includi semplicemente un manifest con le informazioni supportate su OS.
Suggerimento 1 : se stai sviluppando un'app .NET con Visual Studio, com'ero, ecco [4] alcune belle istruzioni su come personalizzare il manifest dell'applicazione.
Suggerimento 2 : prestare attenzione all'avvio dell'applicazione da Visual Studio. Ho scoperto che, dopo aver aggiunto il manifest appropriato, avevo ancora problemi con PCA all'avvio da Visual Studio, anche se ho usato Avvia senza debug. Avvio della mia applicazione da Explorer ha funzionato, tuttavia. Dopo aver aggiunto manualmente devenv per l'esclusione da PCA utilizzando il registro, anche le applicazioni di avvio che hanno utilizzato Job Objects da VS hanno iniziato a funzionare. [5]
Suggerimento 3 : se mai vuoi sapere se il tuo PCA è il tuo problema, prova ad avviare l'applicazione dalla riga di comando o copia il programma su un'unità di rete ed eseguilo da lì. La PCA viene automaticamente disabilitata in tali contesti.
[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-perchè-ci-le-regole-on-you.aspx cambiato-
[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 processo può essere associato a più di un lavoro in Windows 8"
[4] Come posso incorporare un manifest in un'applicazione usando VS2008?
[5] Come impedire al debugger di Visual Studio di avviare il mio processo in un oggetto lavoro?