¿Cómo puede una aplicación acceder a la variable de entorno establecida por otra aplicación?
-
06-07-2019 - |
Pregunta
En este caso, la aplicación que establece la variable de entorno se ejecuta en / desde la aplicación que necesita acceder al env.var. Los Main () Valores de retorno (Guía de programación de C #) msdn discute su uso dentro de un archivo por lotes. Si intento lo mismo, todo está bien; pero lo que se requiere es ejecutar no desde un script por lotes sino desde una aplicación.
Process.Start("app","args"); // app sets the env.var.
string envVar = System.Environment.GetEnvironmentVariable("ERRORLEVEL");
obviamente no tuvo éxito. Process.Start hizo la " app " trabajar en un ambiente completamente diferente, creo. En otras palabras, necesito ejecutar " app " en el mismo entorno que la aplicación de llamada para alcanzar la variable de entorno que establece.
Solución
Si solo está tratando de establecer el entorno del niño desde el padre:
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();
Si no desea que el hijo herede el entorno del proceso 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);
Otros consejos
Las variables de entorno se heredan de los procesos secundarios, pero cada elemento secundario obtiene una copia; si cambia el entorno del elemento primario posteriormente, esto no se reflejará en el elemento secundario.
Esto es por razones de seguridad: si las variables se compartieran, los procesos podrían verse en la memoria del otro, lo que causaría todo tipo de problemas.
Entonces, la solución es establecer la variable antes de comenzar el nuevo proceso.
Si necesita comunicarse con un proceso secundario existente, use una tubería.
Cada aplicación se ejecuta con su propia copia del entorno, por lo que un proceso secundario no puede influir en el entorno del padre. Esto es cierto hasta CreateProcess, donde el entorno es un parámetro de entrada / opcional, es decir, unidireccional.
Hay muchos mecanismos IPC que tiene disponibles, desde canalizaciones con nombre a sockets hasta memoria compartida a archivos ... la lista continúa.
Pero sospecha que los archivos serán los más fáciles para usted.
Puede hacer que el proceso hijo cree un archivo que contenga los pares de nombre / valor que desea y que la aplicación que realiza la llamada pueda cargar y usar. El formato podría ser algo básico como:
clave = valor clave2 = valor2
un poco más complejo (pero quizás más fácil de trabajar) como XML ... o cualquier formato personalizado que desee.
El comando debe ejecutarse dentro del entorno del proceso actual. Normalmente, bash ejecutará todos los procesos como un proceso secundario que recibe una copia de solo lectura del entorno del padre y crea una nueva entrada cada vez que se modifica una variable.
Dot (.) es un comando que no debe confundirse con la especificación del directorio actual. El comando dot hace que el siguiente comando se ejecute dentro del entorno del padre. De esta manera, las variables de entorno del proceso son las variables de entorno del proceso de llamada.