目录
介绍
为什么
位置
机器配置
应用配置
用户设置
其他配置
方式
应用设置部分
connectionStrings部分
applicationSettings和userSettings部分
升级设置
接下来是什么
进一步阅读
更新:本文中的大部分信息现已过时。首选的配置机制现在位于Microsoft.Extensions.Configuration NuGet 包和相关包中。有关更多详细信息,请参阅此链接中的ConfigurationBuilder类文档。
介绍我已经使用.NET配置文件很多年了。我认为如果我向他们提供一个快速的介绍,可能对其他人有帮助。
在本文档中,许多C#代码示例都假设您在项目中包含了对System.Configuration.dll的引用,并且您在代码中包含了以下using语句:
using System.Configuration;
这两个都是访问ConfigurationManager类所必需的,这是访问配置信息的一种方法。
为什么.NET Framework 提供了一组丰富的类和技术来简化应用程序配置。本质上,所有这些类都使从XML配置文件读取和写入配置信息变得容易。
配置文件包括许多标准部分,一些用于常见.NET功能的自定义部分,还允许开发人员创建自己的自定义配置部分。
标准部分随着时间的推移而发展。最初,标准配置主要通过appSettings包含每个设置的名称/值对的部分完成。随着时间的推移,透明的,类型安全的支持通过生成的C#Settings类及相应的applicationSettings与userSettings配置部分提供。
位置我在哪里可以找到配置文件?这是一个看似复杂的问题。由于配置是分层的,实际上有多个配置文件可能会影响一个应用程序。其中包括机器配置文件、应用程序(或 Web)配置文件、用户本地设置文件和用户漫游设置文件。
机器配置机器配置文件与不太容易找到的.NET Framework文件一起存在。配置文件的位置取决于应用程序使用的.NET版本和平台类型(例如64位)。
一个典型的例子可能是C:\Windows\Microsoft.NET\Framework\v4.0.30319\CONFIG\machine.config。
在您的C#应用程序代码中,以下内容将返回文件的位置:
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
+ @"CONFIG\machine.config"
应用程序配置文件通常与您的应用程序位于同一目录中。对于Web应用程序,它被命名为Web.config。对于非Web应用程序,它以App.config的名称开始。在构建之后,它被复制到与您的.exe文件相同的名称。因此,对于程序MyProgram.exe,您可能希望在同一目录中找到MyProgram.exe.config。
在您的C#应用程序代码中,以下内容将返回文件的位置:
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
虽然通常不建议这样做,但您可能会发现某些应用程序更改了应用程序配置文件的位置,如下所示:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "NewName.config")
用户设置几乎不可能找到,也许是故意的。目录的名称因Windows版本而异。更复杂的是,父文件夹通常是隐藏的。文件夹结构还包含公司名称(应用程序供应商的)、应用程序名称、应用程序的唯一标识和应用程序版本。
例如,在Windows 7上,本地用户设置可能如下所示:
C:\Users\MyUsername\AppData\Local\CompanyName\MyProgram.exe_Url_pnbmzrpiumd43n0cw05z2h4o23fdxzkn\1.0.0.0\user.config
在C#中,您可以获取本地用户设置(第一行)或漫游用户设置(第二行)的基目录,如下所示:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
在C#中(参见概述中的注释),您可以获得本地用户设置(第一行)或漫游用户设置(第二行)的确切文件路径,如下所示:
ConfigurationManager.OpenExeConfiguration
(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming).FilePath
如果这还不够令人困惑,您应该了解一些其他文件。有一个根Web.config(位于与machine.config相同的目录中)。此外,Web应用程序的子目录可以通过特定于该子目录的Web.config提供对继承设置的额外覆盖。
最后,IIS提供了一些它自己的配置。一个典型的位置是:C:\Windows\System32\inetsrv\ApplicationHost.config。
方式如前所述,应用程序配置文件被分成许多相当标准的配置部分。在这里,我们简要讨论一些最常见的部分。
应用设置部分最简单的标准配置部分是appSettings,它包含每个设置的名称/值对集合:
在C#中(请参阅概述中的注释),您可以按如下方式引用设置的值:
string mySetting = ConfigurationManager.AppSettings["MySetting"];
由于数据库连接在.NET中非常常见,因此为数据库连接字符串提供了一个特殊部分。该部分称为connectionStrings:
在C#中,您可以按如下方式获取连接字符串:
string connectionString = ConfigurationManager.ConnectionStrings[
"MyConnectionStringName"].ConnectionString;
最初,人们可能想知道是否需要引用 “连接字符串”的ConnectionString属性。事实上,该connectionStrings部分的名称很糟糕。更好的名称可能是connectionStringSettings,因为每个条目都包含一个连接字符串和一个数据库提供程序。
连接字符串的语法完全由数据库提供者决定。在这种情况下,System.Data.SqlClient是Microsoft SQL Server数据库最常见的数据库提供程序。
applicationSettings和userSettings部分在.NET 2.0中,Microsoft 试图使配置文件的使用变得更加容易。他们引入了一个设置文件。细心的观察者会注意到“设置”在应用程序配置文件中开始它们的生命,然后被复制到用户设置配置文件中。
对于Windows窗体和WPF应用程序,您将在项目的Properties文件夹中找到一个文件Settings.settings。对于控制台应用程序和其他应用程序,您还可以利用设置。打开项目的属性,然后单击设置按钮/选项卡。您将获得添加默认设置文件的选项。
通常,您编辑此设置文件(或项目的设置)而不是直接编辑配置文件。下面的示例仅用于演示这些设置确实存在于配置文件中。
MyUserSettingValue
MyApplicationSettingValue
要引用其中一项设置,您只需使用自动为您创建的Settings类。一个典型的参考,可能如下所示:
string myUserSetting = Properties.Settings.Default.MyUserSetting;
string myApplicationSetting = Properties.Settings.Default.MyApplicationSetting;
注意:Properties是在应用程序的命名空间中自动创建的命名空间。
要更改用户的设置,您只需为属性分配一个值并保存更改,如下所示:
Properties.Settings.Default.MyUserSetting = newValueForMyUserSetting;
Properties.Settings.Default.Save();
最终,您将希望发布应用程序的新版本。在这里,您可能会遇到一个常见问题。由于用户设置是特定于版本的,它们将在升级后丢失。
值得庆幸的是,该框架预见到了这一需求并提供了Upgrade方法。处理此问题的典型方法是包含一个布尔Upgraded用户设置,初始值为false(首次部署应用程序时)。
因此,处理升级(并保留以前的用户设置)的典型代码如下所示:
if (!Properties.Settings.Default.Upgraded)
{
Properties.Settings.Default.Upgrade();
Properties.Settings.Default.Upgraded = true;
Properties.Settings.Default.Save();
}
在上一节中,您可能已经注意到configSections配置文件中相当冗长的部分。这是微软如何扩展配置文件来添加新的userSettings和applicationSettings章节。
这也是您可以添加自己的自定义配置部分的方式。
简而言之,您可以通过扩展ConfigurationSection和ConfigurationElement类来做到这一点。在您的每个派生类中,您将使用ConfigurationPropertyAttribute.
简单吧?只是在开玩笑。其他人对这个稍微复杂但不太困难的机制提供了很好的描述。我在本文档的末尾提供了链接以供进一步阅读。
在这里,我只想提供一些提示,这些提示可能会在较长的描述中丢失。
全部完成后,您需要创建一个XML架构文档(XSD文件),用于描述您的部分,并将其包含在您的项目中。打开配置文件后,您可以使用XML...Schemas菜单项来确保智能感知找到您的XSD文件。
根据您的Visual Studio版本,您可能会听到有关xmlns配置部分中的属性的一些抱怨。如果你这样做,有一个简单的解决方案。我通常从我自己的中间类XmlnsConfigurationSection派生,而不是直接派生自ConfigurationSection. 它使问题消失!
using System.Configuration;
namespace Extras.Configuration
{
abstract public class XmlnsConfigurationSection : ConfigurationSection
{
[ConfigurationProperty("xmlns")]
public string Xmlns
{
get { return (string)this["xmlns"]; }
set { this["xmlns"] = value; }
}
}
}
- ASP.NET 配置文件层次结构和继承
- System.Configuration命名空间
- ConfigurationSection类
- ConfigurationElement类
- ConfigurationPropertyAttribute类
- ConfigurationElementCollection类
https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files