关于c#:从.net中的app.config或web.config读取设置

Reading settings from app.config or web.config in .net

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

我发现

1
ConfigurationSettings.AppSettings.Get("MySetting")

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

我已经读到我应该使用:

1
ConfigurationManager.AppSettings["MySetting"]

然而,System.Configuration.ConfigurationManager类似乎无法从C类库项目中获得。

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


对于下面的app.config示例:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 
   
   
  </appSettings>
</configuration>

您可以使用以下代码阅读以上应用程序设置:

1
using System.Configuration;

如果您的项目中还没有System.Configuration,您可能还需要添加一个对System.Configuration的引用。然后您可以访问如下值:

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

希望这有帮助!


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

您肯定应该使用ConfigurationManager而不是过时的ConfigurationSettings


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

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

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

1
string keyvalue= Properties.Settings.Default.keyname;

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


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


我用这个,它对我很好

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


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


从配置读取:

您需要添加对config的引用

百万千克1打开项目的"属性"百万千克1百万千克1转到"设置"选项卡百万千克1百万千克1添加"name"和"value"百万千克1百万千克1

使用以下代码获取值:

字符串值=properties.settings.default.keyname;

百万千克1

保存到配置:

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


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

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

  • 索德尔
  • 某物

您的问题可能与您将app.config包含到somedll而不是someexe的事实有关。somedll能够从someexe项目读取配置。


试试这个:

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

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

1
2
3
4
5
<configuration>


</appSettings>
</configuration>


我也有同样的问题,请这样读:

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


web.config用于Web应用程序。默认情况下,web.config具有Web应用程序所需的几种配置。在Web应用程序下,每个文件夹都可以有一个web.config

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

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

1
System.Configuration.ConfigurationSettings.AppSettings["Key"]


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

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


正如我发现的,通过在system.configuration上创建包装类,以系统方式访问应用程序设置变量的最佳方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
            }
        }
    }

现在,我们可以使用下面的另一个类,通过硬编码名称访问所需的设置变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
    }


此外,您还可以使用formo:

配置:

1
</appSettings>

代码:

1
2
3
4
5
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>();


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

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

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


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

步骤2:单击"部件"选项卡

步骤3:搜索"system.configuration"

第四步:点击确定。

那就行了

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

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

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


另一个可能的解决方案:

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

几天来,我一直在努力寻找解决这个问题的方法。我可以通过在web.config的appsettings标记中添加一个键来解决这个问题。在使用帮助程序时,这应该覆盖.dll。

1
2
3
4
5
6
<configuration>



</appSettings>
</configuration>


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


您可以使用下面的行,在我的情况下,它是工作的:

1
System.Configuration.ConfigurationSettings.AppSettings["yourKeyName"]

您必须注意,上面的代码行也是旧版本,在新库中不推荐使用。


例如:App.config

1
2
3
4
5
6
7
        <MyApp.My.MySettings>
            <setting name="Printer" serializeAs="String">
                <value>1234 </value>
            </setting>
        </MyApp.My.MySettings>
    </applicationSettings>
Dim strPrinterName as string= My.settings.Printer