Sto avviando una piccola applicazione di console dall'interno della mia applicazione web IIS. Il codice viene avviato dall'interno di un pool di app utilizzando il codice come questo,Che differenza ha UseShellExecute?
Process process = new Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.CreateNoWindow = true;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// ..
process.Start();
ho usato per ottenere in modo intermittente un errore,
Win32Exception exception has occured Message: No such interface supported
ErrorCode: 80004005 NativeErrorCode: 80004002
ho dimostrato che quando questo è successo l'applicazione di console non partiva a tutti.
ho aggiunto al codice di sopra di questo,
processStartInfo.UseShellExecute = false;
E il problema è andato via (finora, incrociamo le dita). Capisco che apportando questa modifica non è necessario un contesto desktop valido per l'esecuzione, ma cosa significa esattamente. Se ciò significa che non possiamo eseguire il codice sopra se non esiste un desktop (che si applica a un pool di app IIS in esecuzione con un utente di sistema), allora perché è stato utilizzato a volte in passato anziché fallire ogni volta?
Qualcuno ha idea del perché questo farebbe la differenza? Cosa significa un'interfaccia supportata in questo contesto?
UPDATE:
ho preso a bordo di tutto persone hanno detto, e fatto più ricerca me stesso. Quindi, per riassumere se hai UseShellExecute = true (che è l'impostazione predefinita) chiamerà ShellExecuteEX in shell32.dll per eseguire il processo. Lo farà questo in realtà (copiato dal System.dll utilizzando ILSpy),
public bool ShellExecuteOnSTAThread()
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
ThreadStart start = new ThreadStart(this.ShellExecuteFunction);
Thread thread = new Thread(start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
else
{
this.ShellExecuteFunction();
}
return this._succeeded;
}
Se hai UseShellExecute = false allora sarà chiamata CreateProcess in kernel32.dll per avviare il processo.
mi chiedevo se c'è un problema con il fatto che il codice ShellExecuteOnSTAThread sopra è la creazione di un nuovo thread? È possibile che il pool di applicazioni raggiunga un limite al threading che potrebbe causare indirettamente Win32Exception?
Ho visto questa specifica modalità di errore menzionata più volte negli ultimi due mesi. Nulla di vicino a una spiegazione, ma usando UseShellExecute = false lo risolverà sicuramente. –
Grazie. Dove altro l'hai visto? Non riesco davvero a trovarlo da nessuna parte? Scusa se ti faccio una domanda a cui non puoi rispondere, ma sarei curioso di trovarli. – peter
Questo non risponde a ciò che Hans sta ottenendo, ma questa domanda SO ha alcuni dettagli interessanti: http://stackoverflow.com/questions/5255086/when-do-we-need-to-set-useshellexecute-to-true –