903

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

我发现

ConfigurationSettings.AppSettings.Get("MySetting")

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

我读过我应该使用:

ConfigurationManager.AppSettings["MySetting"]

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

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

4

26 回答 26

966

对于如下示例 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"];
于 2012-10-15T08:47:41.297 回答
863

您需要在项目的引用文件夹中添加对的引用。 System.Configuration

你绝对应该使用ConfigurationManagerover the obsolete ConfigurationSettings

于 2009-07-27T17:00:39.897 回答
99

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

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

现在通过属性访问设置类:

string keyvalue = Properties.Settings.Default.keyname;

有关详细信息,请参阅管理应用程序设置

于 2015-08-21T18:24:09.123 回答
39

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

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

于 2009-07-27T17:51:10.373 回答
30

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

textBox1.Text = ConfigurationManager.AppSettings["Name"];
于 2011-11-30T23:15:08.763 回答
28

从配置中读取:

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

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

    string value = Properties.Settings.Default.keyname;
    

保存到配置:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
于 2016-08-07T12:29:46.810 回答
21

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

于 2009-07-27T17:01:55.027 回答
20

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

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

  • 一些DLL
  • 一些Exe

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

于 2013-06-12T18:59:47.127 回答
14

试试这个:

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

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

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
于 2014-11-16T06:12:56.197 回答
8

我有同样的问题。以这种方式阅读它们:System.Configuration.ConfigurationSettings.AppSettings["MySetting"]

于 2013-10-16T10:53:52.420 回答
8

第 1 步:右键单击“参考”选项卡以添加参考。

第 2 步:单击“程序集”选项卡

第 3 步:搜索“System.Configuration”

第四步:点击确定。

然后它将起作用。

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
于 2019-01-04T06:11:33.983 回答
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"]

于 2011-12-16T07:33:47.043 回答
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
}
于 2016-10-14T06:33:11.333 回答
4

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

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

于 2012-10-18T19:19:11.067 回答
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>();
于 2015-05-18T20:58:46.373 回答
4

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

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

工具->NuGet 包管理器->管理解决方案的 NuGet 包...

微软文档

文档中值得注意的一件事......

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

于 2020-03-06T00:22:34.640 回答
3

为了完整起见,还有一个仅适用于 Web 项目的选项:System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]

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

于 2016-03-16T11:59:27.210 回答
2

我总是使用为所有配置值声明的类型安全属性创建一个 IConfig 接口。Config 实现类然后包装对 System.Configuration 的调用。您的所有 System.Configuration 调用现在都在一个地方,维护和跟踪正在使用的字段并声明它们的默认值变得更加容易和清晰。我编写了一组私有辅助方法来读取和解析常见数据类型。

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

于 2016-01-10T23:29:07.507 回答
2

ConfigurationManager 不是您访问自己的设置所需要的。

为此,您应该使用

{YourAppName}.Properties.Settings.{settingName}

于 2019-07-19T13:55:28.240 回答
2

我能够使以下方法适用于 .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);
    }
    
于 2019-07-26T02:31:28.460 回答
1

几天来,我一直在尝试解决同样的问题。我可以通过在web.config文件的 appsettings 标记中添加一个键来解决此问题。这应该在使用帮助程序时覆盖 .dll 文件。

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>
于 2013-04-30T18:06:46.233 回答
1

另一种可能的解决方案:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
于 2016-03-30T14:34:46.867 回答
1

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

于 2018-09-23T04:46:40.627 回答
1

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

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

于 2019-03-29T11:12:29.813 回答
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 文件

于 2021-05-17T06:51:37.227 回答
-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
于 2017-01-09T22:57:35.093 回答