从.config文件获取AppSettings的值

208

我无法访问配置文件中的值。

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var clientsFilePath = config.AppSettings.Settings["ClientsFilePath"].Value; 
// the second line gets a NullReferenceException

.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- ... -->
    <add key="ClientsFilePath" value="filepath"/>
    <!-- ... -->
  </appSettings>
</configuration>

你有什么建议我该怎么做吗?

18个回答

411

这对我有效:

string value = System.Configuration.ConfigurationManager.AppSettings[key];

7
我提供的代码需要存在于与YourProgram.exe相同的文件夹中的YourProgram.exe.config文件。请确保文件在那里。一个常见的错误是将app.config文件复制到目标目录,这样做是无效的。 - Adam
45
需要添加引用 System.Configuration - checksum
16
我的.NET 4.5的System.Configuration没有ConfigurationManager。 - qwert_ukg
5
我在一个4.5项目中也遇到了null的情况,我花了两个小时来解决它...一定是个bug。 - IrishChieftain
1
我通过安装这个NuGet包解决了问题:System.Configuration.ConfigurationManager 然后使用以下代码获取配置项的值:string value = ConfigurationManager.AppSettings[key]; - alansiqueira27
显示剩余4条评论

72

dtsg给出的答案是有效的:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

然而,你需要在代码中添加程序集引用

System.Configuration

前往你的解决方案资源管理器,右键点击引用并选择添加引用。选择程序集选项卡,然后搜索Configuration

引用管理器

这是我的App.config的一个示例:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="AdminName" value="My Name"/>
    <add key="AdminEMail" value="MyEMailAddress"/>
  </appSettings>
</configuration>

您可以通过以下方式获得:

string adminName = ConfigurationManager.AppSettings["AdminName"];

2
我似乎遇到了与 OP 相同的问题。使用 VS2015。我不知道如何或为什么,但我的 System.Configuration 引用说 System.configuration(小写)。 - Tim
这个内容需要扩展,以涵盖没有“程序集”选项卡的情况(至少在VS2019中)。 - SomeoneElse

23

试一下这个:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

4
你对此的实现一定是错误的。这绝对可以用于从配置文件中检索键值。 - dtsg
1
请确保在项目的引用中添加 System.Configuration 的引用! - GrahamJ

22

从配置文件中读取:

您需要添加对配置文件的引用。

  1. 打开项目的“属性”
  2. 转到“设置”选项卡
  3. 添加“名称”和“值”
  4. 使用以下代码获取值:
string value = Properties.Settings.Default.keyname;

保存到配置文件:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();

4
非常有帮助,因为使用ConfigurationManager的所有其他答案都无法正常工作,如果您像您描述的那样在项目属性的设置选项卡中添加了值。谢谢。 - The Dumb Radish
2
这对我也起作用了。使用上述建议时,我得到了一个null字符串,但是Properties.Settings.Default.<keyName>非常好用! - dub stylee
@Masoud Siahkali,上周我在自己的项目中尝试了你这里几乎所有的内容,但是当用户在运行时更改值(目前只是从VS GUI运行)时,这些值不会跨实例保持。我的问题:https://stackoverflow.com/questions/61018443/winforms-application-settings-changes-dont-appear-to-be-persisting?noredirect=1#comment107954751_61018443。仍然没有弄清楚为什么用户更改这些值的设置不会持久化... - marky

8

我正在使用:

    ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
    //configMap.ExeConfigFilename = @"d:\test\justAConfigFile.config.whateverYouLikeExtension";
    configMap.ExeConfigFilename = AppDomain.CurrentDomain.BaseDirectory + ServiceConstants.FILE_SETTING;
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
    value1 = System.Configuration.ConfigurationManager.AppSettings["NewKey0"];
    value2 = config.AppSettings.Settings["NewKey0"].Value;
    value3 = ConfigurationManager.AppSettings["NewKey0"];

value1 = ...value3 = ... 为空值,而 value2 = ... 有效时:

我决定使用以下内容替换内部 app.config 文件:

// Note works in service but not in wpf
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"d:\test\justAConfigFile.config.whateverYouLikeExtension");
ConfigurationManager.RefreshSection("appSettings");

string value = ConfigurationManager.AppSettings["NewKey0"];

使用VS2012 .net 4版本


这正是我所需要的。非常有帮助,谢谢。 - Umut OVECOGLU

6
app/web.config文件中设置以下配置:
<configuration>
  <appSettings>
    <add key="NameForTheKey" value="ValueForThisKey" />
    ... 
    ...    
  </appSettings>
...
...
</configuration>

然后,您可以在代码中通过添加以下行来访问此内容:

string myVar = System.Configuration.ConfigurationManager.AppSettings["NameForTheKey"];

请注意,这对于.net4.5.x.net4.6.x有效;但不适用于.net core

最好的问候: Rafael

3

长时间未回来,现在回到这个问题...

考虑到 ConfigurationManager 的停用,对于仍在寻找答案的人,可以尝试以下方法(例如):

AppSettingsReader appsettingsreader = new AppSettingsReader();
string timeAsString = (string)(new AppSettingsReader().GetValue("Service.Instance.Trigger.Time", typeof(string)));

当然需要System.Configuration。

(编辑代码以使其实际可用且更易阅读)


回答不错,但请整理一下。为什么在重新创建AppSettingsReader时要创建新实例?而且您不需要将字符串强制转换,只需将其结束到.ToString()覆盖即可。 - Maytham Fahmi

2

我做的是我认为最明显的事情:

string filePath = ConfigurationManager.AppSettings.GetValues("ClientsFilePath").ToString();

虽然编译成功,但它总是返回 null。

然而,上面的代码可以正常工作:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

2

一些答案依我之见似乎有点偏离主题。以下是我的想法约在2016年左右

<add key="ClientsFilePath" value="filepath"/>

请确保已引用System.Configuration

问题要求获取appsettings键的

这个值应该是:

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

这里有一个技巧,可以将值分组在一起(不适用于此问题)

var emails = ConfigurationManager.AppSettings[ConfigurationManager.AppSettings["Environment"] + "_Emails"];

emails 将是环境变量键值(Environment Key)+ "_Emails" 的值。

example :   jack@google.com;thad@google.com;

2
  1. 在您的项目上打开“属性”
  2. 转到“设置”选项卡
  3. 添加“名称”和“值”

代码将自动生成

    <configuration>
      <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup ..." ... >
          <section name="XX....Properties.Settings" type="System.Configuration.ClientSettingsSection ..." ... />
        </sectionGroup>
      </configSections>
      <applicationSettings>
        <XX....Properties.Settings>
          <setting name="name" serializeAs="String">
            <value>value</value>
          </setting>
          <setting name="name2" serializeAs="String">
            <value>value2</value>
          </setting>
       </XX....Properties.Settings>
      </applicationSettings>
    </configuration>
获取值的方式:
Properties.Settings.Default.Name 或者
Properties.Settings.Default["name"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接