代码改变世界

[深入浅出系列]System.Environment

2009-12-21 21:42  老博客哈  阅读(4858)  评论(1编辑  收藏  举报

       一年前在我拜读Lippman的《C# Primer》一作的时候,有一句话深深地激励了我。原话差不多是这么说的,“要想成为C#方面的专家,至少得要精通Framework中的1000个类”,很明显我离这个数值还相差甚远,这不,“亡羊补牢,犹未晚也”,今天就拿一个比较简单的Environment类开刀。

      如果说我把一篇文章搞成了MSDN的样子没有太多意义,因此我会在保持MSDN内容权威性的基础上,结合Reflector以及自己的一些使用心得来一窥它的奥秘,权当自娱自乐。

 

一、这个类是用来做什么的?

Environment类主要是用来提供有关当前环境和平台的信息以及操作它们的方法。无法继承此类。

 

 二、Environment类中的属性分别有什么用途,怎么实现的?

  • CommandLine  【只读】获取该进程的命令行。 其实这和C++中的int main(int argc, char* argv[])中的char* argv[]比较像,因为argv[0]始终是可执行文件的路径或名称等,后面是具体的非空命令行参数。而在C#中 public static void Main(string[]args)中,这里的args默认Length是为0的,它不会把可执行文件的路径或名称放在第一个位置,只会存放非空的命令行参数。 它的具体实现是调用Win32 API GetCommandLine 。
  • CurrentDirectory 【读写】获取或设置当前工作目录的完全限定路径。 内部实现调用的是System.IO里面DirectoryGetCurrentDirectorySetCurrentDirectory操作,至于后者怎么操作,就不在这里赘述了,有空如果能写到System.IO可以试试。
  • ExitCode 【读写】获取或设置进程的退出代码。实现应该也是使用Win32 API,具体没有找到对应函数,这个让人想起来C++中的::EXIT_SUCCESS 和::EXIT_FAILURE 。 
  • HasShutdownStarted 【只读】获取一个值,该值指示是否公共语言运行库正在关闭或者当前的应用程序域正在卸载。
  • MachineName 【只读】获取此本地计算机的 NetBIOS 名称。使用的是API GetComputerName
  • NewLine 【只读】获取为此环境定义的换行字符串。包含"\r\n"的字符串,用于非 Unix 平台,包含"\n"的字符串,用于 Unix 平台。搞笑呢,实现里面只返回了"\r\n"。
  • OSVersion 【只读】获取包含当前平台标识符和版本号的 OperatingSystem 对象。主要使用Win32 API中的OSVERSIONINFO 和 OSVERSIONINFOEX结构体以及GetVersionEx实现。
  • ProcessorCount 【只读】获取当前计算机上的处理器数。用这个就能看出来机器是“单核”、“双核”还是“三核”甚至“多核”了。实现主要是使用Win32 API中的结构体SYSTEM_INFOGetSystemInfo实现。
  • StackTrace 【只读】获取当前的堆栈跟踪信息。内部实现使用的是System.Diagnostics中的StackTrace类。
  • SystemDirectory 【只读】获取系统目录的完全限定路径。内部实现使用GetSystemDirectory 。
  • TickCount 【只读】获取系统启动后经过的毫秒数。 内部GetTickCount实现。
  • UserDomainName 【只读】获取与当前用户关联的网络域名。使用GetUserNameLookupAccountName实现。
  • UserInteractive 【只读】获取一个值,用以指示当前进程是否在用户交互模式中运行。实现使用GetProcessWindowStationUSEROBJECTFLAGSGetUserObjectInformation
  • UserName 【只读】获取当前已登录到 Windows 操作系统的人员的用户名。 使用使用GetUserName
  • Version 【只读】获取一个 Version 对象,该对象描述公共语言运行库的主版本、次版本、内部版本和修订号。内部直接return new Version("2.0.50727.3053");
  • WorkingSet 【只读】获取映射到进程上下文的物理内存量。、

 三、Environment类中的方法分别有什么用途,怎么实现的?

  • public static void Exit(int exitCode); 终止此进程并为基础操作系统提供指定的退出代码
  • public static string ExpandEnvironmentVariables(string name); 将嵌入到指定字符串中的每个环境变量的名称替换为该变量的值的等效字符串,然后返回结果字符串。 内部使用API  ExpandEnvironmentStrings 。
  • public static void FailFast(string message); 终止进程但不执行任何活动 try-finally 块或终结器。 
  • public static string[] GetCommandLineArgs();返回包含当前进程的命令行参数的字符串数组。其实我觉得就是比args数组多了一个首元素。
  • public static string GetEnvironmentVariable(string variable);从当前进程检索环境变量的值。内部GetEnvironmentVariable实现。
  • public static string GetEnvironmentVariable(string variable, EnvironmentVariableTarget target);从当前进程或者从当前用户或本地计算机的 Windows 操作系统注册表项检索环境变量的值。内部实现如果是进程的话,调用前一个单参数的重载形式,否则从注册表中读取。
  • public static IDictionary GetEnvironmentVariables(); 从当前进程检索所有环境变量名及其值。
  • public static IDictionary GetEnvironmentVariables(EnvironmentVariableTarget target);从当前进程或者从当前用户或本地计算机的 Windows 操作系统注册表项检索所有环境变量名及其值。 
  • public static string GetFolderPath(Environment.SpecialFolder folder);获取指向由指定枚举标识的系统特殊文件夹的路径。内部实现使用SHGetFolderPath。我在本机实验的时候Environment.GetFolderPath(Environment.SpecialFolder.MyComputer)返回的是空字符串,不知道为啥。
  • public static string[] GetLogicalDrives();返回包含当前计算机中的逻辑驱动器名称的字符串数组。内部使用GetLogicalDrives实现。
  • public static void SetEnvironmentVariable(string variable, string value);创建、修改或删除当前进程中存储的环境变量。
  • public static void SetEnvironmentVariable(string variable, string value, EnvironmentVariableTarget target);创建、修改或删除当前进程中或者为当前用户或本地计算机保留的 Windows 操作系统注册表项中存储的环境变量。实现采用SetEnvironmentVariable