アプリケーションは、別のアプリケーションによって設定された環境変数にどのようにアクセスできますか?
-
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メカニズムがたくさんあります...リストは続きます。
しかし、ファイルがあなたにとって最も簡単であると疑っています。
子プロセスに、必要な名前/値のペアを含むファイルを作成させて、呼び出し側アプリケーションがロードして使用できるようにすることができます。形式は次のような基本的なものになります:
key = value key2 = value2
XMLなどのやや複雑な(ただし作業しやすいかもしれません)...または任意のカスタム形式。
コマンドは、現在のプロセスの環境内で実行する必要があります。通常、bashはすべてのプロセスを子プロセスとして実行し、親の環境の読み取り専用コピーが与えられ、変数が変更されるたびに新しいエントリを作成します。
ドット(。)は、現在のディレクトリの指定と混同しないでくださいコマンドです。 dotコマンドを使用すると、親の環境内で次のコマンドが実行されます。このように、プロセスの環境変数は呼び出しプロセスの環境変数です。