AppSettings从.config文件获取值


172

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

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>

您有什么建议吗?

Answers:


345

这对我有用:

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

6
我提供的代码要求YourProgram.exe.config文件与YourProgram.exe存在于同一文件夹中。只要确保它在那里。一个常见的错误是将app.config文件复制到目标目录,这将不起作用。
亚当

40
需要添加参考System.Configuration
校验和

13
我的.NET 4.5 System.Configuration还没有ConfigurationManager
qwert_ukg '16

3
我在4.5项目中也得到了null-为此花了两个小时。
IrishChieftain

1
我也在多目标应用程序中看到了这一点,我的.net核心配置有效,但.net框架配置不起作用(使用ConfigurationManager)
Michael Brown

61

dtsg给出的答案有效:

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

但你需要添加一个程序集引用

系统配置

转到解决方案资源管理器,然后右键单击 “引用”,然后选择“ 添加引用”。选择组件选项卡并搜索配置

参考经理

这是我的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

21

试试看:

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

4
您对它的实现必须不正确。这绝对适用于从配置文件中检索键值。
dtsg 2012年

确保在项目的引用中添加对System.Configuration的引用!
GrahamJ

19

从配置读取:

您需要添加对Config的引用

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

保存到配置:

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

4
确实很有帮助,因为如果您如上所述在项目属性的“设置”选项卡中添加值,则使用ConfigurationManager的所有其他答案均无效。谢谢。
愚蠢的萝卜

2
这也为我工作。我得到了null以上建议的字符串,但Properties.Settings.Default.<keyName>工作起来很迷人!
dub stylee

1
太好了!我一直在寻找这个:)谢谢!
HSQL

@Masoud Siahkali,上周,我在我自己的项目中尝试了几乎所有内容,但是当用户在运行时更改值时(现在仅从VS GUI运行它),这些值不会在实例之间持久化。我的问题是:stackoverflow.com/questions/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 = ...给出null而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

5

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。最好的问候:拉斐尔


3

很久以后又回来了...

鉴于ConfigurationManager的消亡,对于仍然在寻找这种尝试答案的任何人(例如):

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

当然需要System.Configuration。

(将代码编辑为实际有效且易于阅读的内容)


好的答案,但是请清理一下,为什么再次重新创建AppSettingsReader时又要创建AppSettingsReader的新实例,并且不需要强制转换字符串,只需将其终止于.ToString()覆盖即可。
maytham-ɯɐɥʇʎɐɯ

2

看到我做了我认为显而易见的事情是:

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

在编译时,它始终返回null。

但是,这(从上面)有效:

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

2

某些答案似乎与IMO有点关系 这是我大约在2016年采取的行动

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

确保System.Configuration已引用。

问题是要求设置键的

哪个应该是

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

这是您可以将值分组在一起的一种方式(不适用于此问题)

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

emails 将为环境键+“ _Emails”的值

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

2

对于Web应用程序,我通常会编写此方法,并仅通过键调用它。

private String GetConfigValue(String key)
    {
       return System.Web.Configuration.WebConfigurationManager.AppSettings[key].ToString();
    }

1

您可以简单地输入:

string filePath = Sysem.Configuration.ConfigurationManager.AppSettings[key.ToString()];

因为key是一个对象,AppSettings需要一个字符串


1
ConfigurationManager.RefreshSection("appSettings")
string value = System.Configuration.ConfigurationManager.AppSettings[key];

1

或者您可以使用

string value = system.configuration.ConfigurationManager.AppSettings.Get("ClientsFilePath");

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection

0

按照此处其他答案的建议,我的简单测试也失败了,直到我意识到我添加到桌面应用程序的配置文件被命名为“ App1.config”。我将其重命名为“ App.config”,一切立即按预期进行。


0
  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 [“名称”]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.