目次
概要
アプリケーションの構成情報(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で解析する処理を追加してください。
- フラグとして使用する場合(例:
注意点
- OSによる大文字・小文字の扱い
- Windowsでは
PATHとPathは同一視されますが、Linux/macOSでは別の変数として扱われます。クロスプラットフォームなアプリを開発する際は、変数名を大文字(例:APP_CONFIG)で統一する規約を設けるのが安全です。
- Windowsでは
- 反映タイミングのラグ
- Windowsのシステム環境変数を変更した場合、すでに起動しているプロセスやターミナルには即座に反映されません。アプリケーションまたはシェルの再起動が必要です。
- 機密情報のログ出力
- 環境変数にはパスワードやトークンが含まれることが多いため、ログ出力時は必ず値をマスクするか、出力しないように制御してください。
応用
全環境変数のダンプ出力
デバッグ時、コンテナ内やサーバー上でどのような変数が定義されているかを確認するために、すべての変数を列挙する方法です。
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等)を採用することで、開発・テスト・本番環境の切り替えをスムーズに行うことができます。
