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

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

我发现了

 ConfigurationSettings.AppSettings.Get("MySetting") 

工作,但该代码已被标记为由Microsoft弃用。

我读过,我应该使用:

 ConfigurationManager.AppSettings["MySetting"] 

但是, System.Configuration.ConfigurationManager类似乎从C#类库项目中不可用。

有谁知道什么是最好的方法来做到这一点?

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

您肯定应该使用ConfigurationManager覆盖过时的ConfigurationSettings

对于示例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"]; 

希望这可以帮助!

更新框架4.5和4.6; 以下将不再工作:

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

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

 string keyvalue= Properties.Settings.Default.keyname; 

请参阅pipe理应用程序设置了解更多信

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

我使用这个,它适合我

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

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

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

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

  • SomeDll
  • SomeExe

你的问题可能是由于你将app.config包含到SomeDLL而不是SomeExe。 SomeDll能够从SomeExe项目读取configuration。

尝试这个:

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

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

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

我有同样的问题,只是读它们:

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

从configuration读取:

您需要添加对Config的引用

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

    string值= Properties.Settings.Default.keyname;

保存到configuration:

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

我强烈build议你为这个调用创build一个Wrapper。 就像一个ConfigurationReaderService并使用dependency injection来获得这个类。 这样你就可以隔离这个configuration文件用于testing目的。

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

另外,你可以使用formo :

configuration:

 <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>(); 

正如我find了最好的方法来访问应用程序设置variables系统的方式通过使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); } } } 

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

 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 } 

web.config用于Web应用程序。 web.config默认会有几个Web应用程序所需的configuration。 您可以为Web应用程序下的每个文件夹设置一个web.config

app.config用于Windows应用程序。 在vs.net中构build应用程序时,它将自动重命名为<appname>.exe.config并且此文件必须随应用程序一起传送。

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

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

我一直在试图find一个解决这个问题几天。 我可以通过在web.config中的appsettings标签中添加一个键来解决这个问题。 这应该覆盖使用助手时的.dll。

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

我总是创build一个带有为所有configuration值声明的types安全属性的IConfig接口。 一个Config实现类然后包装对System.Configuration的调用。 所有的System.Configuration调用现在都在一个地方,更容易,更清洁地维护和跟踪哪些字段正在使用并声明其默认值。 我写了一组私有的帮助器方法来读取和分析常见的数据types。

使用IoC框架,只需将接口传递给类构造函数,即可访问应用程序中任何位置的IConfig字段。 您也可以在unit testing中创buildIConfig接口的模拟实现,以便您现在可以testing各种configuration值和值组合,而无需触摸App.config或Web.config文件。

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

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

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

另一个可能的解

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

例如:

 <applicationSettings> <MyApp.My.MySettings> <setting name="Printer" serializeAs="String"> <value>1234 </value> </setting> </MyApp.My.MySettings> </applicationSettings> Dim strPrinterName as string= My.settings.Printer