从.net中的app.config或web.config中读取设置
我正在处理一个C#类库,它需要能够从web.config
或app.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的引用
- 在你的项目上打开“属性”
- 转到“设置”标签
- 添加“名称”和“值”
-
使用以下代码获取价值:
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