惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News | PayPal Newsroom
S
Security Affairs
T
Tor Project blog
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
U
Unit 42
云风的 BLOG
云风的 BLOG
The Hacker News
The Hacker News
Cisco Talos Blog
Cisco Talos Blog
量子位
F
Full Disclosure
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
Troy Hunt's Blog
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
腾讯CDC
AI
AI
Last Week in AI
Last Week in AI
Latest news
Latest news
Google Online Security Blog
Google Online Security Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 老博客哈

HDU第11版解题报告(农夫版) 第(前)k大数问题 SRM 144-149 C#与Matlab混合编程的几种方式 Ajax开发框架(下)[整理] Ajax开发框架(中)[整理] Ajax开发框架(上)[整理] 语义网在线课程 Tidy - 一个把HTML 转成XHTML的工具库[整理] 2008企业级Web产品Top 10 (来源于ReadWriteWeb) (小规模)b牌棋盘完美覆盖数【整理】 一类棋盘互不攻击问题 稳定婚姻问题(Stable Marriage Problem) 2007 South Central USA Regional Programming Contest 解题报告 《C#完全手册》中提到的一些内部工具及编译选项 TC 泛黄了 Introduction to String Searching Algorithms--Rabin-Karp and Knuth-Morris-Pratt Algorithms [翻译] TopCoder C# User List TCHS SRM 1
[深入浅出系列]System.Environment
老博客哈 · 2009-12-21 · via 博客园 - 老博客哈

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

       一年前在我拜读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