在.NET中从app.config或web.config读取设置


806

我正在使用一个C#类库,该库需要能够从web.configapp.config文件中读取设置(取决于DLL是从ASP.NET Web应用程序还是Windows Forms应用程序引用的)。

我发现

ConfigurationSettings.AppSettings.Get("MySetting")

可以,但是该代码已被Microsoft标记为已弃用。

我读过我应该使用:

ConfigurationManager.AppSettings["MySetting"]

但是,System.Configuration.ConfigurationManager该类似乎无法从C#类库项目中获得。

做这个的最好方式是什么?


48
就像我阅读了4个MSDN示例和文章。只需添加参考即可。为什么他们不能这么说。好问题!+1
Piotr Kula 2012年

1
如果您也想回写设置,请查看此处的操作方法。
马特

Answers:


797

你需要一个引用添加System.Configuration您的项目的引用文件夹

您绝对应该使用ConfigurationManager过时的工具ConfigurationSettings


非常感谢你!非常简单的答案。我正在构建一个控制台应用程序!这个答案可以节省一天!
PatsonLeaner

1
.net核心是否仍然准确?
Triynko

867

对于如下所示的示例app.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

您使用以下代码阅读上述应用程序设置:

using System.Configuration;

如果还没有引用,则可能还需要System.Configuration在项目中添加对它的引用。然后,您可以像这样访问这些值:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];

124
我比您接受的答案更喜欢您的答案。用例子回答总是对我有用。
布伦丹·沃格特

这对我有用。但是,我的System.Configuration不包含ConfigurationManager,因此我不得不使用ConfigurationSettings。具有讽刺意味的是,我仍然收到过时的警告。
梦m游戏

13
这也发生在我身上。您是否尝试过添加System.Configuration参考?问题是VS通过让您认为自己确实拥有它来欺骗您。您可以使用intellisense获取名称空间System.Configuration,但它没有ConfigurationManager类。只需添加参考即可解决问题。
Francine DeGrood Taylor

3
@Cricketheads System.Configuration确实包含ConfigurationManager,您可能在项目中缺少对System.Configuration的引用。
TreK 2015年

2
有人可以告诉我为什么他们认为默认情况下未添加System.Configuration……这似乎是大多数应用程序中非常基本的需求。
Todd Vance

89

.NET Framework 4.5和4.6更新;以下将不再起作用:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

现在通过属性访问Setting类:

string keyvalue = Properties.Settings.Default.keyname;

有关更多信息,请参见管理应用程序设置


1
2010年以来的物业。
尼克·韦斯特盖特

1
非常感谢您发布此信息。我确定Properties.Settings.Default.MachName可以工作,但我不知道为什么ConfigurationManager.AppSettings [“ MachName”]返回null。
克里斯·康普顿

1
这结束了我长期的痛苦。谢谢。该框架应警告您旧方法已过时。
尼尔B

7
无法确认。ConfigurationManager.AppSettings [“ someKey”]在.NET 4.5、4.6、4.7.1中工作
Ivanhoe

1
@Ivanhoe您使用了什么版本的VisualStudio?ConfigurationManager.AppSettings [“ someKey”]适用于4.6.1和VS 15.8.2,但对我来说适用于4.6.1和VS 15.9.2。
kkuilla

37

右键单击您的类库,然后从菜单中选择“添加引用”选项。

然后从.NET选项卡中,选择System.Configuration。这会将System.Configuration DLL文件包含到您的项目中。


添加参考后,能够做到ConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

我正在使用它,对我来说效果很好:

textBox1.Text = ConfigurationManager.AppSettings["Name"];

48
TS明确声明,他使用相同的代码,但是他的项目无法编译(由于事实证明缺少参考)。-1为未读问题。
Isantipov

23

从配置读取:

您需要添加对配置的引用:

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

    string value = Properties.Settings.Default.keyname;

保存到配置:

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

1
仅供参考:Google最喜欢您的答案。当您搜索“获取应用程序配置设置c#”时,显示逐字显示
Steve Gomez


18

您可能正在将App.config文件添加到DLL文件中。App.Config仅适用于可执行项目,因为所有DLL文件都从正在执行的EXE文件的配置文件中获取配置。

假设您的解决方案中有两个项目:

  • SomeDll
  • 某某

您的问题可能与以下事实有关:您将app.config文件包括在SomeDLL中,而不是SomeExe中。SomeDll能够从SomeExe项目中读取配置。


哇,那不是很明显。如果有人可以链接讨论此问题的文档,那将是很棒的。这是一个很难研究的话题。
大卫·克里德

谢谢你 没在任何地方看到此内容。
参数

10

尝试这个:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

web.config文件中,这应该是下一个结构:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>

8

我有同样的问题。只需这样阅读即可:System.Configuration.ConfigurationSettings.AppSettings [“ MySetting”]


4
根据Microsoft关于ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
彼得M

2
这种方法已经过时了
GabrielBB

7

web.config用于Web应用程序。web.config默认情况下,Web应用程序需要几种配置。您可以web.config在Web应用程序下为每个文件夹设置一个。

app.config用于Windows应用程序。在Visual Studio中构建应用程序时,它将自动重命名为<appname>.exe.config并且该文件必须与您的应用程序一起交付。

您可以使用相同的方法app settings从两个配置文件中调用值:System.Configuration.ConfigurationSettings.AppSettings [“ Key”]


也可以使用System.Configuration.COnfigurationSettings.AppSettings.Get("Key")而不使用方括号。
梅森

7

正如我所发现的,通过在System.Configuration上创建包装类,以系统的方式访问应用程序设置变量的最佳方法如下所示

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;

            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

现在,我们可以使用另一个类通过硬编码名称访问所需的设置变量:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting

    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }

    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }

    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }

    #endregion App setting

    #region global setting


    #endregion global setting
}

这将使用OP指出的方法标记为已弃用。
user2864740

4

我强烈建议您为此调用创建一个包装器。类似于ConfigurationReaderService和使用依赖注入来获取此类。这样,您将能够隔离此配置文件以进行测试。

因此,使用ConfigurationManager.AppSettings["something"];建议值并返回此值。如果.config文件中没有可用的密钥,则可以使用此方法创建某种默认返回值。


3
微软已经拥有了储存卡式的方式来管理相同的配置文件的多个版本:构建配置,允许有不同的配置文件为每个生成配置:app.DEBUG.configapp.RELEASE.config,和app.TEST.config
jpaugh

4

另外,您可以使用Formo

组态:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

码:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();

5
您到底为什么要这样做?
lukejkw

3

仅出于完整性考虑,还有一个仅适用于Web项目的选项:System.Web.Configuration.WebConfigurationManager.AppSettings [“ MySetting”]

这样做的好处是不需要添加额外的引用,因此对于某些人来说可能更可取。


3

步骤1:右键单击“引用”选项卡以添加引用。

步骤2:点击“程序集”标签

步骤3:搜索“ System.Configuration”

步骤4:点击OK(确定)。

然后它将起作用。

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];

2

我总是使用为所有配置值声明的类型安全属性创建IConfig接口。然后,Config实现类将调用包装到System.Configuration。现在,您所有的System.Configuration调用都集中在一个地方,维护和跟踪正在使用的字段并声明其默认值非常容易和整洁。我编写了一组私有帮助器方法来读取和解析常见的数据类型。

使用IoC框架,只需将接口传递给类构造函数,就可以在应用程序中的任何位置访问IConfig字段。然后,您还可以在单​​元测试中创建IConfig接口的模拟实现,因此您现在可以测试各种配置值和值组合,而无需触摸App.config或Web.config文件。


1

另一个可能的解决方案:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();

1

几天来,我一直在寻找针对同一问题的修复程序。我可以通过在web.config文件的appsettings标记内添加密钥来解决此问题。使用帮助程序时,这应覆盖.dll文件。

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>

1

您可以使用以下行。就我而言,它正在工作:System.Configuration.ConfigurationSettings.AppSettings [“ yourKeyName”]

您必须注意上面的代码行也是旧版本,并且在新库中已弃用。


1

不需要ConfigurationManager来访问自己的设置。

为此,您应该使用

{YourAppName}.Properties.Settings.{settingName}


1

我能够使以下方法适用于.NET Core项目:

脚步:

  1. 在您的项目中创建一个appsettings.json(格式如下)。
  2. 接下来创建一个配置类。下面提供了格式。
  3. 我创建了一个Login()方法来显示配置类的用法。

    在项目中使用内容创建appsettings.json:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }

1

如果您需要/想要使用该ConfigurationManager课程...

您可能需要System.Configuration.ConfigurationManager通过NuGet软件包管理器由Microsoft 加载

工具-> NuGet软件包管理器->管理NuGet软件包以获取解决方案...

微软文档

值得一提的是文档...

如果您的应用程序需要对其自身配置的只读访问权限,我们建议您使用GetSection(String)方法。此方法提供对当前应用程序的缓存配置值的访问,其性能比Configuration类好。


0

请检查您正在使用的.NET版本。它应该高于4。并且您必须将System.Configuration系统库添加到您的应用程序。


3
这个问题是在9年前提出的,已经有20多个答案,其中2个都有600多个投票,公认的答案是添加对System.Configuration的引用。这个额外的答案不会增加价值。充其量,这应该是对已接受答案的评论。
查迪西莫(Richardissimo)

关于“高于4”的信息:主要版本号?还是说“高于4.0”?换句话说,.NET Framework 4.5在哪一边?
彼得·莫滕森

-8

这是一个例子: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
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.