至今我已经与 .NET 配置文件(.config文件)打交道了几年了。我想如果我提供一个对这些文件的快速入门会对大家有些帮助。
在本文章中,许多 C# 源码例子都假设你的项目已经引用了 System.Configuration.dll 和引用了下面的命名空间:
using System.Configuration;
这是使用ConfigurationManager类所必须的,而这个类提供了一种使用配置信息的方法。
NET框架提供了一套丰富的类和技术,以简化应用配置。从本质上讲,所有这些类可以很容易地从XML配置文件的读取和写入,配置信息。
配置文件包含了.net程序中的一些标准的以及自定义的节点,并且也允许开发者创建自己的配置节点。
标准节点随着时间跟以前比有了很大的改变。最开始的时候,标准节点主要是配置应用程序的配置内容,比如为一个属性一个属性或者一个值。随着时间的推移,它也为类型安全提供了支持,同时可以生成C#标准的配置信息以及用户自定义的配置信息
我从哪里找到配置文件?这是一个迷惑性的复杂问题。自从配置文件分层后,有多个配置文件可能影响一个应用程序。这包括机器的配置文件,应用程序(或者网页)配置文件,用户本地设置文件,用户的Roaming设置文件。
和.NET框架文件一起的机器配置文件,并不是很容易找到。配置文件的位置还取决于.NET的版本和应用程序使用的平台(比如,64位)
一个典型的例子就是
C:WindowsMicrosoft.NETFrameworkv4.0.30319CONFIGmachine.config
在你的C#应用程序代码中,下面的语句将会返回文件的位置:
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() + @"CONFIGmachine.config"
应用程序配置文件一般跟你的应用程序存在于相同的目录下面。对于web应用程序来说,它的名字是Web.config,而对一般的应用程序来说,它的名字是App.config。在一个项目下,它的名字格式与你的.exe文件相似。比如你的工程名字是MyProgram.exe,那么你就可以在相同的路径下找到MyProgram.exe.config。
在你的C#应用程序源代码中,使用下面的代码可以返回文件的路径:
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile如果它不是被经常调用,你可以做在应用程序的配置文件中做一些小的修改。下面是例子:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "NewName.config")
用户设置大多数时候不好找,这很可能是处于设计的原因。目录的名字因Windows版本而异。更复杂的是父目录通常是隐藏的。. 目录结构加入了公司名称(应用程序的供应商),应用程序名称,应用程序唯一ID号和应用程序的版本。
举个例子,在Windows7下,一个本地用户设置可能像这样:
C:UsersMyUsernameAppDataLocalCompanyNameMyProgram.exe_Url_pnbmzrpiumd43n0cw05z2h4o23fdxzkn1.0.0.0user.config
在C#中,你可以获得本地用户设置的基目录(第一行)或者临时用户设置(第二行):
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)在C#中, (见在概述中的注记),你可以获得本地用户设置的解压文件路径(第一行)或者roaming用户设置(第二行):
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming).FilePath
如果这还不够混乱,那你应该知道其它的一些文件了(这个不会翻译)。有个原始的Web.config文件(与machine.config同一个目录下)。此外,子目录下面的Web应用程序可能会通过子目录里面的Web.config重写继承(于父目录的Web.config)的设置。
此外,IIS提供了一些自己的配置。一个典型的例子位置在:
C:WindowsSystem32inetsrvApplicationHost.config
正如前面提到的,应用程序配置文件被分解成若干的相当标准配置部分。在这里,我们简要地讨论一下一些最常见的部分。
最简单的标准设置部分就是 appSettings 了,这个部分包含了一系列保存配置的 键/值 对。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="MySetting" value="MySettingValue" /> </appSettings> </configuration>
在C#中(见附注概述),你可以通过下面方式引用对应配置的值:
string mySetting = ConfigurationManager.AppSettings["MySetting"];
由于数据库连接在.NET中相当普遍,一个特别用于提供数据库连接字符串的部分产生了。这个部分就是 connectionStrings。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="MyConnectionStringName" connectionString="Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>
在 C# 中,你可以通过下面方式去获取连接字符串:
string connectionString = ConfigurationManager.ConnectionStrings[ "MyConnectionStringName"].ConnectionString;
起初人们可能会奇怪在需要引用一个"connection string"属性作为连接字符串。说实话,这个connectionStrings部分的名字真不恰当。叫做"connectionStringSettings"会更恰当,因为(部分_里面的每个实体够包含了连接字符串和database provider(数据库提供者)。
一个连接字符串的语法完全取决于其database provider。 因此 System.Data.SqlClient 是Microsoft SQL Server最典型的database provider。
在 .NET 2.0 中,微软尝试让用户更容易使用设置文件。他们为此引入了设置文件。细心的观察者可能会注意到这些"settings"开始用于应用程序配置文件,并且在后面复制到用于配置文件中。
在Windows Form和WPF程序中,你可以在你的项目的Properties目录下找到一个名为Settings.settings的文件。对于控制台程序还有其它程序,可以通过下面方式使用配置文件。打开你的项目中属性,切换到 设置 选项,你可以通过这里为项目添加一个配置文件。
通常情况下,你可以编辑此设置文件(或者是你的项目设置)来修改配置,而不是直接编辑(.config)配置文件。下面的例子演示了设置在配置文件中如何存储。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <section name="WinFormConfigTest.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <section name="WinFormConfigTest.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <userSettings> <WinFormConfigTest.Properties.Settings> <setting name="MyUserSetting" serializeAs="String"> <value>MyUserSettingValue</value> </setting> </WinFormConfigTest.Properties.Settings> </userSettings> <applicationSettings> <WinFormConfigTest.Properties.Settings> <setting name="MyApplicationSetting" serializeAs="String"> <value>MyApplicationSettingValue</value> </setting> </WinFormConfigTest.Properties.Settings> </applicationSettings> </configuration>
当你想引用设置的时候,你可以简单的引用Settings类,这个类会自动为你创建。下面是一个典型的引用方式:
string myUserSetting = Properties.Settings.Default.MyUserSetting; string myApplicationSetting = Properties.Settings.Default.MyApplicationSetting;
注意:Properties 命名空间会自动的创建在你的应用程序的命名空间下。
要改变用户设置时,你只需像下面一样为属性赋予一个值然后保存就可以了:
Properties.Settings.Default.MyUserSetting = newValueForMyUserSetting; Properties.Settings.Default.Save();
实际上,当你想发布一个新版本的程序时,你可能会遇到的一个普遍问题。由于用户设置是有特定版本的,程序升级会导致这些设置丢失。
值得庆幸的是,框架预预料到这种情况并提供了一个更新设置的方法。一个典型的处理办法是引入一个初始值为false的用户设置“Upgraded”(当你首次部署你的程序)。
因此,用来处理升级的典型代码(并保留以前的用户设置)如下所示:
if (!Properties.Settings.Default.Upgraded) { Properties.Settings.Default.Upgrade(); Properties.Settings.Default.Upgraded = true; Properties.Settings.Default.Save(); }
在前一部分,你可能注意到了配置文件相当冗长的configSections。这也是微软如何拓展配置文件,用来添加新的用户设置和应用设置。
它也是你如何来添加你自己定制的配置的区块。
简而言之,你通过拓展 theConfigurationSectionandConfigurationElement类来完成的。在你的每一个继承的类里,你会用类似ConfigurationPropertyAttribute这样的属性来布置你的类成员。
很简单,对吗?开个玩笑。对于其他的,已经提供了很好很详细,稍微有点复杂的描述,和不是很难理解的机制。我会在这篇文档的末尾添加这些链接供进一步阅读。
这里,我只想提供一些在冗长描述中会感到困惑的提示。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务