Come può un'applicazione accedere alla variabile di ambiente impostata da un'altra applicazione?
-
06-07-2019 - |
Domanda
In questo caso l'applicazione che imposta la variabile di ambiente viene eseguita nell' / dall'applicazione che deve accedere a env.var. Il Main () Valori di ritorno (Guida per programmatori C #) msdn ne discute l'utilizzo all'interno di un file batch. Se provo lo stesso, va tutto bene; ma ciò che è richiesto non deve essere eseguito da uno script batch ma dall'interno di un'applicazione.
Process.Start("app","args"); // app sets the env.var.
string envVar = System.Environment.GetEnvironmentVariable("ERRORLEVEL");
ovviamente non ha avuto successo. Process.Start ha creato l'app "quot" lavoro in un ambiente completamente diverso credo. In altre parole, devo eseguire " app " nello stesso ambiente dell'applicazione chiamante per raggiungere la variabile di ambiente che imposta.
Soluzione
Se stai solo cercando di impostare l'ambiente del bambino dal genitore:
var p = new Process();
p.StartInfo.EnvironmentVariables["TEST_ENV"] = "From parent";
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = @"C:\src\bin\Debug\ChildProc.exe";
p.Start();
Se non si desidera che il figlio erediti l'ambiente del processo padre:
var psi = new ProcessStartInfo();
psi.EnvironmentVariables["TEST_ENV"] = "From parent";
psi.UseShellExecute = false;
psi.FileName = @"C:\src\bin\Debug\ChildProc.exe";
Process.Start(psi);
Altri suggerimenti
Le variabili di ambiente sono ereditate dai processi figlio ma ogni figlio ne ottiene una copia: se successivamente si modifica l'ambiente del genitore, ciò non si rifletterà nel figlio.
Questo per motivi di sicurezza: se le variabili fossero condivise, i processi potrebbero vedersi nella memoria reciproca, causando ogni tipo di problema.
Quindi la soluzione è impostare la variabile prima di iniziare il nuovo processo.
Se è necessario comunicare con un processo figlio esistente, utilizzare una pipe.
Ogni applicazione viene eseguita con la propria copia dell'ambiente, quindi un processo figlio non può influenzare l'ambiente del padre. Questo vale fino in fondo a CreateProcess in cui l'ambiente è un parametro di input / facoltativo, ovvero unidirezionale.
Esistono molti meccanismi IPC disponibili dalle pipe con nome ai socket, dalla memoria condivisa ai file ... l'elenco continua.
Ma il sospetto che i file saranno i più facili per te.
È possibile che il processo figlio crei un file che contiene le coppie nome / valore desiderate che l'applicazione chiamante potrebbe quindi caricare e utilizzare. Il formato potrebbe essere qualcosa di semplice come:
chiave = valore chiave2 = valore2
un po 'più complesso (ma forse più facile da lavorare) come XML ... o qualsiasi formato personalizzato desiderato.
Il comando deve essere eseguito all'interno dell'ambiente del processo corrente. Normalmente, bash eseguirà tutti i processi come un processo figlio a cui viene data una copia di sola lettura dell'ambiente del genitore e crea una nuova voce ogni volta che viene modificata una variabile.
Il punto (.) è un comando che non deve essere confuso con le specifiche della directory corrente. Il comando punto fa eseguire il comando seguente nell'ambiente del genitore. In questo modo, le variabili d'ambiente del processo sono le variabili d'ambiente del processo chiamante.