응용 프로그램이 다른 응용 프로그램에서 설정 한 환경 변수에 어떻게 액세스 할 수 있습니까?
-
06-07-2019 - |
문제
이 경우 환경 변수를 설정하는 응용 프로그램은 ENV.VAR에 액세스 해야하는 응용 프로그램에서/에서 실행됩니다. 그만큼 Main () 반환 값 (C# 프로그래밍 안내서) MSDN 기사는 배치 파일 내에서의 사용에 대해 설명합니다. 내가 똑같이 시도하면 모든 것이 괜찮습니다. 그러나 필요한 것은 배치 스크립트가 아니라 응용 프로그램 내에서 실행하는 것입니다.
Process.Start("app","args"); // app sets the env.var.
string envVar = System.Environment.GetEnvironmentVariable("ERRORLEVEL");
분명히 실패했습니다. Process.Start는 내가 믿는 완전히 다른 환경에서 "앱"을 만들었습니다. 다시 말해, 설정하는 환경 변수에 도달하려면 발신자 응용 프로그램과 동일한 환경에서 "앱"을 실행해야합니다.
해결책
부모로부터 자녀의 환경을 설정하려는 경우 :
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();
자녀가 부모 프로세스 환경을 물려 받기를 원하지 않는 경우 :
var psi = new ProcessStartInfo();
psi.EnvironmentVariables["TEST_ENV"] = "From parent";
psi.UseShellExecute = false;
psi.FileName = @"C:\src\bin\Debug\ChildProc.exe";
Process.Start(psi);
다른 팁
환경 변수는 아동 과정에 상속되지만 각 어린이는 사본을 얻습니다. 나중에 부모의 환경을 변경하면 어린이를 반영하지 않습니다.
이는 보안상의 이유입니다. 변수가 공유 된 경우 프로세스는 서로의 기억에 따라 모든 종류의 문제를 일으킬 수 있습니다.
따라서 솔루션은 새 프로세스를 시작하기 전에 변수를 설정하는 것입니다.
기존 아동 프로세스와 통신 해야하는 경우 파이프를 사용하십시오.
각 응용 프로그램은 자체 환경 사본으로 실행되므로 아동 프로세스는 부모의 환경에 영향을 줄 수 없습니다. 이것은 환경이 입력/선택적 매개 변수, 즉 일방성 인 CreateProcess까지 마찬가지입니다.
명명 된 파이프에서 소켓, 공유 메모리, 파일에 이용할 수있는 많은 IPC 메커니즘이 있습니다. 목록은 계속됩니다.
그러나 파일이 가장 쉬운 파일이 될 것이라고 의심합니다.
하위 프로세스에 호출 응용 프로그램이로드 및 사용할 수있는 이름/값 쌍이 포함 된 파일을 만들 수 있습니다. 형식은 다음과 같은 기본 일 수 있습니다.
키 = 값 key2 = value2
XML과 같이 조금 더 복잡하지만 (하지만 작업하기가 더 쉽습니다) 또는 원하는 사용자 정의 형식.
명령은 현재 프로세스의 환경 내에서 실행되어야합니다. 일반적으로 Bash는 모든 프로세스를 자식 프로세스로 실행하여 부모 환경의 읽기 전용 사본을 제공하고 변수가 수정 될 때마다 새 항목을 만듭니다.
DOT (.)는 현재 디렉토리의 사양과 혼동해서는 안되는 명령입니다. DOT 명령은 부모의 환경 내에서 다음 명령을 실행하게합니다. 이러한 방식으로 프로세스의 환경 변수는 호출 프로세스의 환경 변수입니다.