응용 프로그램이 다른 응용 프로그램에서 설정 한 환경 변수에 어떻게 액세스 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1013383

문제

이 경우 환경 변수를 설정하는 응용 프로그램은 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 명령은 부모의 환경 내에서 다음 명령을 실행하게합니다. 이러한 방식으로 프로세스의 환경 변수는 호출 프로세스의 환경 변수입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top