🔥 第一章:基础操作——读取与设置环境变量
目标:掌握环境变量的读写逻辑与异常处理
🧙 代码彩蛋:环境变量的全流程操作
using System;
using System.IO;
class Program
{
static void Main()
{
// 🔍 读取系统环境变量
string systemDrive = Environment.GetEnvironmentVariable("SystemDrive");
Console.WriteLine($"系统驱动器: {systemDrive}");
// 🔍 读取用户环境变量(注意区分用户与系统作用域)
string userTempPath = Environment.GetEnvironmentVariable("TEMP", EnvironmentVariableTarget.User);
Console.WriteLine($"用户临时目录: {userTempPath}");
// ⚠️ 异常处理:环境变量不存在时的防御性编程
string dbConnectionString = Environment.GetEnvironmentVariable("DB_CONNECTION");
if (string.IsNullOrEmpty(dbConnectionString))
{
throw new InvalidOperationException("数据库连接字符串未配置!");
}
// ✅ 动态设置环境变量(仅当前进程有效)
Environment.SetEnvironmentVariable("APP_ENV", "Production");
Console.WriteLine($"当前环境: {Environment.GetEnvironmentVariable("APP_ENV")}");
// 🔄 重置环境变量
Environment.SetEnvironmentVariable("APP_ENV", null); // 删除变量
}
}
注释彩蛋:
EnvironmentVariableTarget
:指定作用域(Machine
系统级、User
用户级、Process
进程级)- 进程隔离性:通过
Process
设置的变量仅在当前进程中生效 - 异常防御:对关键环境变量(如数据库连接字符串)必须进行存在性检查
🔥 第二章:跨平台实战——环境变量的魔法适配
目标:让代码在Windows/Linux/macOS间无缝切换
🧙 代码彩蛋:动态适配不同操作系统的路径
// 🌍 根据操作系统动态配置日志路径
string logPath = Environment.OSVersion.Platform switch
{
PlatformID.Win32NT => Path.Combine(Environment.GetEnvironmentVariable("SystemDrive"), @"Logs\app.log"),
PlatformID.Unix => Path.Combine(Environment.GetEnvironmentVariable("HOME"), "logs/app.log"),
_ => throw new NotSupportedException("当前操作系统未支持!")
};
Console.WriteLine($"日志路径: {logPath}");
// 📦 依赖管理:通过环境变量指定第三方库路径
string libPath = Environment.GetEnvironmentVariable("LIB_PATH");
if (!string.IsNullOrEmpty(libPath))
{
// 在Windows下添加到PATH变量
Environment.SetEnvironmentVariable(
"PATH",
Environment.GetEnvironmentVariable("PATH") + ";" + libPath,
EnvironmentVariableTarget.Process
);
}
注释彩蛋:
- 跨平台路径拼接:使用
Path.Combine
避免斜杠方向问题 - 动态依赖注入:通过环境变量指定第三方库路径,避免硬编码
🔥 第三章:高级技巧——环境变量的深度应用
目标:解锁环境变量的隐藏功能与性能优化
🧙 代码彩蛋:通过环境变量控制程序行为
// 🔧 环境变量驱动的配置开关
bool enableDebugMode = bool.TryParse(
Environment.GetEnvironmentVariable("ENABLE_DEBUG"),
out enableDebugMode) && enableDebugMode;
if (enableDebugMode)
{
// 启用调试日志、性能分析等
Console.WriteLine("进入调试模式!");
}
// 🔄 环境变量驱动的多环境配置
var config = new ConfigurationBuilder()
.AddEnvironmentVariables() // 自动加载所有环境变量
.Build();
string apiEndpoint = config["API_ENDPOINT"] ?? "https://default.example.com";
Console.WriteLine($"API地址: {apiEndpoint}");
注释彩蛋:
- ConfigurationBuilder:通过
Microsoft.Extensions.Configuration
简化环境变量加载 - 默认值机制:使用
??
或??=
提供合理默认值
🔥 第四章:安全与调试——环境变量的终极防御
目标:构建零风险的环境变量管理体系
🧙 代码彩蛋:敏感信息的安全存储与注入
// 🔒 敏感信息的环境变量注入(避免硬编码)
string secretKey = Environment.GetEnvironmentVariable("API_SECRET");
if (string.IsNullOrEmpty(secretKey))
{
throw new SecurityException("API密钥未配置!");
}
// 🔑 使用.env文件管理环境变量(需第三方库dotenv.net)
public static class EnvironmentVariables
{
static EnvironmentVariables()
{
// 从项目根目录加载.env文件
DotEnv.Load(); // 需安装NuGet包: dotenv.net
}
}
// 🛠️ 环境变量调试技巧
void PrintAllEnvironmentVariables()
{
foreach (DictionaryEntry entry in Environment.GetEnvironmentVariables())
{
Console.WriteLine($"{entry.Key}: {entry.Value}");
}
}
注释彩蛋:
- .env文件管理:通过
DotEnv.Load()
自动加载同目录下的.env
文件 - 安全验证:对敏感变量(如API密钥)进行非空检查与格式校验
🔥 第五章:注册表操作——系统级环境变量的终极控制
目标:通过注册表实现系统级环境变量的持久化
🧙 代码彩蛋:修改系统PATH变量(需管理员权限)
using Microsoft.Win32;
class RegistryHelper
{
public static void AddPathToSystem(string newPath)
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment",
true))
{
// 🔍 读取原始PATH值(不展开系统变量如%SystemRoot%)
string path = (string)key.GetValue("Path", "", RegistryValueOptions.DoNotExpandEnvironmentNames);
// 🔄 拆分路径并去重
string[] paths = path.Split(';');
List<string> pathList = paths.ToList();
if (!pathList.Contains(newPath, StringComparer.OrdinalIgnoreCase))
{
pathList.Add(newPath);
key.SetValue("Path", string.Join(";", pathList), RegistryValueKind.MultiString);
Console.WriteLine("PATH变量已更新!");
}
}
}
}
注释彩蛋:
- 注册表权限:修改系统级环境变量需管理员权限
- MultiString类型:使用
RegistryValueKind.MultiString
存储多值路径 - 去重逻辑:避免重复添加相同路径
- 最佳实践总结:
- 敏感信息绝不硬编码
- 使用
.env
文件管理本地开发环境 - 通过
ConfigurationBuilder
统一配置加载 - 系统级修改需谨慎,优先使用进程级变量