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

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

我已经找到了

ConfigurationSettings.AppSettings.Get("MySetting")

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

我读到我应该使用:

ConfigurationManager.AppSettings["MySetting"]

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

最好的方法是什么?

1213354 次浏览

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

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

您必须将System. Configuration程序集的引用添加到项目中。

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

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

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

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

web.config用于Web应用程序。默认情况下,web.config具有Web应用程序所需的多个配置。您可以为Web应用程序下的每个文件夹设置web.config

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

您可以使用相同的方法从两个配置文件调用app settings值:系统。配置。配置设置。应用程序设置[“键”]

对于如下示例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,你可能还需要添加对System.Configuration的引用。然后,你可以像这样访问值:

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

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

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

几天来,我一直在试图为这个问题找到一个修复程序。我能够通过在web.config文件的app设置标记中添加一个键来解决这个问题。使用帮助程序时,这应该会覆盖. dll文件。

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

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

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

  • 有人
  • 某个Exe

您的问题可能与以下事实有关:您将app.config的文件包含到某些DLL而不是某些Exe。某些Dll能够从某些Exe项目中读取配置。

我也遇到了同样的问题。只需这样阅读它们:系统。配置。配置设置。应用程序设置[“我的设置”]

试试这个:

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

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

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

你可以使用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 stringvar retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10var appBuildDate = config.ApplicationBuildDate<DateTime>();

. NET Framework 4.5和4.6的更新;以下操作将不再有效:

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

现在通过Properties访问设置类:

string keyvalue = Properties.Settings.Default.keyname;

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

我总是创建一个IConfig接口,其中为所有配置值声明了类型安全属性。然后,Config实现类将调用包装到System. Configuration。你的所有System. Configuration调用现在都在一个地方,维护和跟踪正在使用哪些字段并声明它们的默认值要容易得多,也更干净。我编写了一组私有助手方法来读取和解析常见数据类型。

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

为了完整起见,还有另一个选项仅适用于Web项目:系统。Web。配置。Web配置管理器。应用程序设置[“我的设置”]

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

另一种可能的解决方案:

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

从配置中读取:

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

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

    string value = Properties.Settings.Default.keyname;

Save to the configuration:

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

因为我发现了以系统的方式访问应用程序设置变量的最佳方法,方法是在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}

举个例子: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

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

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

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

第3步:搜索“System. Configure”

第4步:单击确定。

然后它将工作。

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

您可以使用下面的行。在我的情况下,它正在工作:系统。配置。配置设置。应用程序设置[“您的密钥名称”]

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

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

要做到这一点,你应该使用

{YourAppName}.Properties.Settings.{settingName}

我能够让下面的方法适用于. 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);}

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

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

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

微软文档

从文档中值得注意的一件事…

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

额外:如果您正在处理类库项目,则必须嵌入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文件

我正在使用Visual Studio for Mac版本17.0.6。

正如你可以看到这个屏幕截图无法添加对System. Configuration的引用

输入图片描述

解决方案:

  1. 安装NuGet包-System. ConfigurationManager。
  2. 创建app.config文件并将“Build action”设置为“EmbeddedResources”
<?xml version="1.0" encoding="utf-8"?><configuration><appSettings><add key="name" value="Joe"/></appSettings></configuration>
  1. 使用System. Configuration;
  2. 享受)

string name=配置管理器.应用设置["name"];

顺便说一句:不要为库添加app.config