提问



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


我发现了


ConfigurationSettings.AppSettings.Get("MySetting")


可以使用,但该代码已被Microsoft标记为已弃用。


我已经读过我应该使用的:


ConfigurationManager.AppSettings["MySetting"]


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


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

最佳参考


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


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

其它参考1


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


希望这可以帮助!

其它参考2


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


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


现在通过Properties访问Setting类:


string keyvalue= Properties.Settings.Default.keyname;





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

其它参考3


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

其它参考4


我使用这个,它适合我


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

其它参考5


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

其它参考6


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


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



  • SomeDll

  • SomeExe



您的问题可能与您将app.config包含在SomeDLL而不是SomeExe中有关.AsdDll能够从SomeExe项目中读取配置。

其它参考7


从配置中读取:


您将需要添加对Config的引用



  1. 在项目中打开属性

  2. 转到设置标签

  3. 添加名称和价值

  4. 使用以下代码获取价值:


    string value=Properties.Settings.Default.keyname;



保存到配置:


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

其它参考8


我有同样的问题,只需这样阅读:


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

其它参考9


尝试这个:


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


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


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

其它参考10


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


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


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

其它参考12


我通过在System.Configuration上创建一个包装类来找到以系统方式访问app设置变量的最佳方法,如下所示


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
    }

其它参考13


另外,你可以使用formo:[37]


配置:


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

其它参考14


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


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

其它参考15


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


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

其它参考16


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


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


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

其它参考17


另一种可能的方案


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

其它参考18


对于前:


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