【问题标题】:AppSettings get value from .config fileAppSettings 从 .config 文件中获取值
【发布时间】:2012-06-01 18:12:23
【问题描述】:

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

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>

你有什么建议吗?

【问题讨论】:

    标签: c# .net appsettings configurationmanager


    【解决方案1】:

    更新

    ConfigurationManager 已过时,需要在.NET Core 环境中使用IConfiguration(IConfiguration 由.NET Core 内置依赖注入提供)。

        private readonly IConfiguration config;
    
        public MyConstructor(IConfiguration config)
        {
            this.config = config;
        }
        public void DoSomethingFunction()
        {
            string settings1 = config["Setting1"];
        }
    

    【讨论】:

      【解决方案2】:

      或者你可以使用

      string value = system.configuration.ConfigurationManager.AppSettings.Get("ClientsFilePath");
      
      //Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection
      

      【讨论】:

        【解决方案3】:
        ConfigurationManager.RefreshSection("appSettings")
        string value = System.Configuration.ConfigurationManager.AppSettings[key];
        

        【讨论】:

          【解决方案4】:
          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"]

          【讨论】:

            【解决方案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。 最好的祝福: 拉斐尔

            【讨论】:

              【解决方案6】:

              从配置中读取:

              您需要添加对 Config 的引用

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

              保存到配置:

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

              【讨论】:

              • 真的很有帮助,因为如果您在项目属性的“设置”选项卡中添加您的值,则使用 ConfigurationManager 的所有其他答案都不起作用,如您所描述的。谢谢。
              • 这对我也有用。我得到了带有上述建议的null 字符串,但Properties.Settings.Default.&lt;keyName&gt; 就像一个魅力!
              • 完美!我在找这个 :) 谢谢!
              • @Masoud Siahkali,上周我尝试了你在我自己的项目中所拥有的东西,但是当用户在运行时更改值时(现在只是从 VS GUI 运行它)不要跨实例持续存在。我的问题:stackoverflow.com/questions/61018443/…。仍然没有弄清楚为什么这些值的用户更改设置不会持续存在......
              【解决方案7】:

              隔了好久再来这个……

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

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

              当然需要 System.Configuration。

              (将代码编辑为实际可行且更易于阅读的内容)

              【讨论】:

              • 好答案,但是请清理一下,为什么在再次重新创建 AppSettingsReader 时创建 AppSettingsReader 的新实例,并且您不需要转换字符串,您可以将其结束为 .ToString() 覆盖.
              【解决方案8】:

              您只需输入:

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

              因为key 是一个对象,而AppSettings 接受一个字符串

              【讨论】:

                【解决方案9】:

                对于 web 应用程序,我通常会编写此方法并使用密钥调用它。

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

                【讨论】:

                  【解决方案10】:

                  有些答案似乎有点离题IMO这是我的看法大约在 2016 年

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

                  确保引用了System.Configuration

                  问题是询问应用设置 key

                  value

                  最肯定应该是

                    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;
                  

                  【讨论】:

                    【解决方案11】:

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

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

                    编译时它总是返回 null。

                    但是(从上面)这有效:

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

                    【讨论】:

                      【解决方案12】:

                      dtsg 给出的答案有效:

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

                      但是,您需要添加一个程序集引用

                      系统配置

                      转到您的解决方案资源管理器右键单击引用并选择添加引用。选择 Assemblies 选项卡并搜索 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"];
                      

                      【讨论】:

                      • 我的问题似乎和 OP 一样。使用 VS2015。我不知道如何或为什么,但我对 System.Configuration 的引用说 System.configuration(小写)。
                      • 这可以通过扩展来覆盖没有“程序集”选项卡的地方(至少 VS2019)
                      【解决方案13】:

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

                      【讨论】:

                        【解决方案14】:

                        我正在使用:

                            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

                        【讨论】:

                        • 这正是我所需要的。真的很有帮助,谢谢。
                        【解决方案15】:

                        试一试:

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

                        【讨论】:

                        • 你的实现一定是错误的。这绝对适用于从配置文件中检索键值。
                        • 确保在项目的引用中添加对 System.Configuration 的引用!
                        【解决方案16】:

                        这对我有用:

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

                        【讨论】:

                        • 我提供的代码要求 YourProgram.exe.config 文件与 YourProgram.exe 存在于同一文件夹中。只要确保它在那里。一个常见的错误是将 app.config 文件复制到目标目录,这将不起作用。
                        • 需要添加参考System.Configuration
                        • 我的 .NET 4.5 System.Configuration 没有 ConfigurationManager
                        • 我在一个 4.5 项目中也得到了一个空值 - 花了两个小时。必须是一个错误。
                        • 我也在多目标应用程序中看到了这一点,我的 .net 核心配置可以工作,但 .net 框架配置不能(使用 ConfigurationManager)
                        猜你喜欢
                        • 1970-01-01
                        • 2021-01-05
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-10-05
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-06-30
                        • 2012-10-06
                        相关资源
                        最近更新 更多