【C#】実行中のプロセス内で環境変数を一時的に設定・削除する

目次

概要

アプリケーションの実行中に、そのプロセス内でのみ有効な環境変数を動的に追加、変更、または削除する方法です。 Environment.SetEnvironmentVariable メソッドを使用することで、外部ライブラリの設定値をコードから注入したり、テスト実行時のみ挙動を切り替えるフラグとして利用したりできます。デフォルトではOS全体の環境変数には影響を与えず、プロセス終了とともに破棄されます。

仕様(入出力)

  • 入力
    • variable (string): 環境変数の名前
    • value (string): 設定する値(null を渡すと変数を削除)
  • 出力
    • なし (void)
  • 動作
    • デフォルトでは EnvironmentVariableTarget.Process が適用され、現在のプロセスおよびそこから起動される子プロセスにのみ影響します。
    • value に空文字("")を設定すると値は空になりますが、変数は削除されません。削除するには null を渡す必要があります。

基本の使い方

変数の設定、値の確認、そして削除を行う基本的なフローです。

string key = "TEST_MODE";

// 1. 設定 (値を入れる)
Environment.SetEnvironmentVariable(key, "Enabled");

// 2. 削除 (nullを入れる)
Environment.SetEnvironmentVariable(key, null);

コード全文

アプリケーションの起動中に一時的な環境変数を定義し、その値を読み取って動作確認を行った後、変数を削除してクリーンアップする完全なコンソールアプリケーションです。

using System;

class Program
{
    static void Main()
    {
        // 定義したい環境変数の名前と値
        const string EnvKey = "APP_FEATURE_FLAG";
        const string EnvValue = "BetaVersion";

        Console.WriteLine("--- 1. 初期状態の確認 ---");
        PrintVariable(EnvKey);

        // ---------------------------------------------------------
        // 環境変数の設定 (プロセススコープ)
        // ---------------------------------------------------------
        Console.WriteLine($"\n--- 2. 環境変数をセット: {EnvKey} = {EnvValue} ---");
        Environment.SetEnvironmentVariable(EnvKey, EnvValue);
        
        // 設定された値を確認
        PrintVariable(EnvKey);

        // ---------------------------------------------------------
        // 環境変数の上書き
        // ---------------------------------------------------------
        Console.WriteLine("\n--- 3. 値を上書き ---");
        Environment.SetEnvironmentVariable(EnvKey, "StableVersion");
        PrintVariable(EnvKey);

        // ---------------------------------------------------------
        // 環境変数の削除
        // ---------------------------------------------------------
        // 第2引数に null を渡すと、その変数は環境ブロックから削除される
        Console.WriteLine("\n--- 4. 変数を削除 (nullをセット) ---");
        Environment.SetEnvironmentVariable(EnvKey, null);
        
        // 削除後の確認
        PrintVariable(EnvKey);
    }

    // 環境変数の状態を表示するヘルパーメソッド
    static void PrintVariable(string key)
    {
        string value = Environment.GetEnvironmentVariable(key);
        if (value == null)
        {
            Console.WriteLine($"[{key}] は存在しません (null)");
        }
        else
        {
            Console.WriteLine($"[{key}] = {value}");
        }
    }
}

実行結果例

--- 1. 初期状態の確認 ---
[APP_FEATURE_FLAG] は存在しません (null)

--- 2. 環境変数をセット: APP_FEATURE_FLAG = BetaVersion ---
[APP_FEATURE_FLAG] = BetaVersion

--- 3. 値を上書き ---
[APP_FEATURE_FLAG] = StableVersion

--- 4. 変数を削除 (nullをセット) ---
[APP_FEATURE_FLAG] は存在しません (null)

カスタムポイント

  • 永続的な設定 (Windowsのみ)
    • 第3引数に EnvironmentVariableTarget.User または EnvironmentVariableTarget.Machine を指定することで、システムやユーザー設定として永続的に保存できます。ただし、Machine ターゲットへの書き込みには管理者権限が必要です。
  • 値の検証
    • 変数名に = が含まれている場合や、名前が長すぎる場合(32767文字以上)は例外が発生するため、ユーザー入力をキーにする場合は検証が必要です。

注意点

  1. 影響範囲(スコープ)
    • 引数なし(または EnvironmentVariableTarget.Process)で設定した場合、その変更は現在のプロセスとその子プロセスにのみ影響します。すでに起動している他のアプリケーションや、OSのシステム設定画面には反映されません。
  2. 削除の方法
    • 空文字 "" をセットしても変数は残ります。「未定義」の状態に戻すには必ず null をセットしてください。
  3. スレッドセーフ
    • 環境変数はプロセス全体で共有されるグローバルな状態です。マルチスレッド環境で頻繁に書き換えると競合や予期しない動作の原因となるため注意が必要です。

応用

実行範囲を限定するスコープ管理クラス

IDisposable を実装し、using ブロックを抜けると自動的に環境変数を元の状態(または削除状態)に戻すユーティリティです。テストコードなどで役立ちます。

using System;

public class ScopedEnvironmentVariable : IDisposable
{
    private readonly string _variable;
    private readonly string _originalValue;

    public ScopedEnvironmentVariable(string variable, string value)
    {
        _variable = variable;
        // 元の値をバックアップ
        _originalValue = Environment.GetEnvironmentVariable(variable);
        // 新しい値をセット
        Environment.SetEnvironmentVariable(variable, value);
    }

    public void Dispose()
    {
        // 元の値に戻す(元がnullなら削除)
        Environment.SetEnvironmentVariable(_variable, _originalValue);
    }
}

// 使用例
// using (new ScopedEnvironmentVariable("MY_API_KEY", "temp-key"))
// {
//     // このブロック内だけ環境変数が書き換わる
// }

まとめ

Environment.SetEnvironmentVariable は、主に外部ライブラリの構成変更やテスト時のモック制御など、プロセス実行中に限定した一時的な環境設定を行う場面で重宝します。永続的な設定変更を行いたい場合はターゲットを明示的に指定する必要がありますが、通常はプロセススコープでの利用が安全かつ一般的です。削除時は空文字ではなく null を渡すという点だけ確実に押さえておきましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次