从.net中的app.config或web.config读取设置

时间:2009-07-27 16:58:45

标签: c# .net configuration appsettings

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

我发现了

ConfigurationSettings.AppSettings.Get("MySetting")

有效,但该代码已被Microsoft标记为已弃用。

我读过我应该使用的:

ConfigurationManager.AppSettings["MySetting"]

但是,C#类库项目似乎没有System.Configuration.ConfigurationManager类。

有谁知道最好的方法是什么?

27 个答案:

答案 0 :(得分:784)

对于Sample 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"]; 的引用。然后,您可以像这样访问值:

{{1}}

希望这有帮助!

答案 1 :(得分:731)

您需要在项目的参考文件夹System.Configuration添加参考

您绝对应该使用ConfigurationManager而不是过时的ConfigurationSettings

答案 2 :(得分:69)

框架4.5和4.6的更新;以下将不再有效:

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

现在通过Properties:

访问Setting类
string keyvalue= Properties.Settings.Default.keyname;

有关详细信息,请参阅Managing Application Settings

答案 3 :(得分:36)

右键单击您的类库,然后从菜单中选择“添加引用”选项;最后从.NET选项卡中选择System.Configuration。这将包括System.Configuration dll到您的项目中。

答案 4 :(得分:29)

我正在使用它,它对我很有用

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

答案 5 :(得分:21)

您必须向项目添加对System.Configuration程序集的引用。

答案 6 :(得分:21)

从配置中读取:

您需要添加对Config的引用

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

    string value = Properties.Settings.Default.keyname;

  5. 保存到配置:

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

答案 7 :(得分:17)

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

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

  • SomeDll
  • SomeExe

你的问题可能与你将app.config包含在SomeDLL而不是SomeExe这一事实有关。 SomeDll能够从SomeExe项目中读取配置。

答案 8 :(得分:9)

试试这个:

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

在web.config中应该是下一个结构:

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

答案 9 :(得分:8)

我遇到了同样的问题,只需按照这种方式阅读:

System.Configuration.ConfigurationSettings.AppSettings["MySetting"]

答案 10 :(得分:7)

web.config与Web应用程序一起使用。默认情况下,web.config具有Web应用程序所需的多个配置。您的Web应用程序下的每个文件夹都可以有web.config

app.config用于Windows应用程序。在vs.net中构建应用程序时,它将自动重命名为<appname>.exe.config,此文件必须与您的应用程序一起提供。

您可以使用相同的方法从两个配置文件中调用app settings值:

System.Configuration.ConfigurationSettings.AppSettings["Key"]

答案 11 :(得分: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>();

答案 12 :(得分:4)

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

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

答案 13 :(得分:4)

我找到了通过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
    }

答案 14 :(得分:3)

为了完整起见,还有另一个选项可用于网络项目:

System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]

这样做的好处是它不需要添加额外的参考,所以对某些人来说可能更好。

答案 15 :(得分:2)

第1步:右键单击“引用”标签以添加引用。

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

第3步:搜索“ System.Configuration”

第4步:点击确定。

然后它将起作用

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

答案 16 :(得分:1)

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

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

答案 17 :(得分:1)

如果您需要/想要使用 ConfigurationManager 类...

您可能需要由Microsoft通过 NuGet程序包管理器

加载System.Configuration.ConfigurationManager

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

Microsoft Docs

文档中需要注意的一件事...

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

答案 18 :(得分:1)

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

为此,您应该使用

{YourAppName}.Properties.Settings.{settingName}

答案 19 :(得分:1)

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

答案 20 :(得分:1)

另一种可能的解决方案:

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

答案 21 :(得分:1)

我一直试图在几天内找到针对同一问题的修复方法。我能够通过在web.config中的appsettings标记中添加一个键来解决这个问题。这应该在使用帮助程序时覆盖.dll。

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

答案 22 :(得分:0)

您可以在下面的行中使用它,在我的情况下它可以正常工作:

System.Configuration.ConfigurationSettings.AppSettings["yourKeyName"]

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

答案 23 :(得分:0)

**For .netcore projects** 

Create appsettings.json in your project with content :
`
{
  "Environments": {
    "QA": {
      "Url": "somevalue",
 "Username": "someuser",
      "Password": "somepwd"
  },
  "BrowserConfig": {
    "Browser": "Chrome",
    "Headless": "true"
  },
  "EnvironmentSelected": {
    "Environment": "QA" 
  }
}
`

Create a Configuration class contents:
`
 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}");
        }

    }
`

Usage : 

`
 public void Login()
        {
            var environment = Configuration.EnvironmentInfo();
            Email.SendKeys(environment["username"]);
            Password.SendKeys(environment["password"]);
            WaitForElementToBeClickableAndClick(_driver, SignIn);
        }
`

答案 24 :(得分:0)

额外:如果您正在处理类库项目,则必须嵌入 settings.json 文件。

<块引用>

类库不应该真正直接引用 app.config - 该类没有 app.config,因为它不是 应用程序,它是一个类。

  1. 转到 JSON 文件的属性。
  2. 更改构建操作 -> 嵌入资源。
  3. 使用以下代码阅读。

var assembly = Assembly.GetExecutingAssembly();

var resourceStream = assembly.GetManifestResourceStream("Assembly.file.json");

string myString = reader.ReadToEnd();

现在我们有了一个 JSON 字符串,我们可以使用 JsonConvert

反序列化它

如果你没有将文件嵌入到程序集中,你就不能只使用没有文件的 DLL 文件

答案 25 :(得分:-1)

制作控制台应用程序时遇到了类似的问题。使用Visual Studio,我使用的是.Net Core而不是.Net Framework。将代码切换到.Net Framework之后,我可以访问“属性”选项卡中的设置。希望这对某人有帮助!

答案 26 :(得分:-4)

这是一个例子: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