【C#】環境変数を活用して設定情報を外部化し、OS間の差異を吸収する実装手法

目次

概要

アプリケーションの構成情報(APIキー、DB接続文字列など)をソースコードから分離して管理するための、環境変数の取得方法を解説します。 System.Environment.GetEnvironmentVariable を使用することで、Windows/Linux/macOSといった異なるプラットフォーム上でも、統一されたコードで設定値やシステムパスへアクセスが可能になります。

仕様(入出力)

  • 入力
    • 取得したい環境変数のキー名(string
    • 検索ターゲット(プロセス、ユーザー、マシン ※オプション)
  • 出力
    • 設定されている値(string
    • 変数が存在しない場合は null
  • 動作
    • デフォルトでは現在のプロセス空間の環境変数を参照します。
    • OSによる変数名の大文字・小文字の区別に注意が必要です(Windowsは区別なし、Linux/macOSは区別あり)。

基本の使い方

キー名を指定して値を取得します。戻り値が null の場合のデフォルト値設定(??演算子)を組み合わせるのが基本パターンです。

// "MY_CONFIG" が未設定なら "DefaultValue" を採用する
string configValue = Environment.GetEnvironmentVariable("MY_CONFIG") ?? "DefaultValue";
Console.WriteLine($"Config: {configValue}");

コード全文

アプリケーションの起動時に「APIキー」と「ユーザーのホームディレクトリ」を取得するシナリオです。OS(Windows vs Linux)による環境変数名の違いを吸収するロジックを含みます。

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("=== アプリケーション設定の読み込み ===");

        // 1. 設定値の取得(クラウドやDocker環境での設定注入を想定)
        // 戻り値がnullの可能性があるため、必要に応じてデフォルト値を設定する
        string apiKey = Environment.GetEnvironmentVariable("APP_API_KEY");
        string dbHost = Environment.GetEnvironmentVariable("DB_HOST") ?? "localhost";

        // セキュアな情報はマスクして表示
        string displayKey = string.IsNullOrEmpty(apiKey) ? "(Not Set)" : "********";

        Console.WriteLine($"API Key : {displayKey}");
        Console.WriteLine($"DB Host : {dbHost}");

        // 2. クロスプラットフォームなパス取得
        // ホームディレクトリを示す変数はOSによって異なる(Windows: USERPROFILE, Unix系: HOME)
        string homeDir = GetHomeDirectory();

        Console.WriteLine($"Home Dir: {homeDir}");

        // 3. 存在しない変数の挙動確認
        string unknown = Environment.GetEnvironmentVariable("UNDEFINED_VAR");
        if (unknown == null)
        {
            Console.WriteLine("Debug   : 指定した環境変数は存在しません。");
        }
    }

    // OSの違いを吸収してホームディレクトリを取得するヘルパーメソッド
    static string GetHomeDirectory()
    {
        // まずUnix系標準の "HOME" を試す
        string path = Environment.GetEnvironmentVariable("HOME");

        if (string.IsNullOrEmpty(path))
        {
            // 取れなければWindows標準の "USERPROFILE" を試す
            path = Environment.GetEnvironmentVariable("USERPROFILE");
        }

        return path ?? "Unknown";
    }
}

実行結果例(Windows環境)

=== アプリケーション設定の読み込み ===
API Key : (Not Set)
DB Host : localhost
Home Dir: C:\Users\DevUser
Debug   : 指定した環境変数は存在しません。

カスタムポイント

  • 変数のスコープ指定
    • Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine) のように第2引数を指定することで、現在のプロセスだけでなく、システム全体やユーザー固有の永続的な環境変数を取得できます。
  • Boolean値としての判定
    • フラグとして使用する場合(例: ENABLE_LOGGING=true)、取得した文字列を bool.TryParse で解析する処理を追加してください。

注意点

  1. OSによる大文字・小文字の扱い
    • Windowsでは PATHPath は同一視されますが、Linux/macOSでは別の変数として扱われます。クロスプラットフォームなアプリを開発する際は、変数名を大文字(例: APP_CONFIG)で統一する規約を設けるのが安全です。
  2. 反映タイミングのラグ
    • Windowsのシステム環境変数を変更した場合、すでに起動しているプロセスやターミナルには即座に反映されません。アプリケーションまたはシェルの再起動が必要です。
  3. 機密情報のログ出力
    • 環境変数にはパスワードやトークンが含まれることが多いため、ログ出力時は必ず値をマスクするか、出力しないように制御してください。

応用

全環境変数のダンプ出力

デバッグ時、コンテナ内やサーバー上でどのような変数が定義されているかを確認するために、すべての変数を列挙する方法です。

using System.Collections;

public static void PrintAllVariables()
{
    // IDictionary形式ですべての変数を取得
    IDictionary variables = Environment.GetEnvironmentVariables();

    foreach (DictionaryEntry entry in variables)
    {
        Console.WriteLine($"{entry.Key} = {entry.Value}");
    }
}

まとめ

Environment.GetEnvironmentVariable は、アプリケーションのポータビリティ(移植性)を高めるために不可欠な機能です。ハードコーディングを避け、環境変数を通じて設定を注入する設計(The Twelve-Factor App等)を採用することで、開発・テスト・本番環境の切り替えをスムーズに行うことができます。

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

この記事を書いた人

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

目次