是否有等同于库(DLL)的app.config
?如果不是,存储特定于库的配置设置的最简单方法是什么?请考虑到该库可能在不同的应用程序中使用。
发布于 2011-03-04 15:40:17
配置文件是应用程序范围的,而不是程序集范围的。因此,您需要将库的配置部分放入正在使用库的每个应用程序的配置文件中。
也就是说,从应用程序的配置文件中获取配置并不是一种好的做法,特别是在类库中的appSettings
部分。如果您的库需要参数,那么调用您的库的任何人都应该将它们作为方法参数传递给构造函数、工厂方法等。这可以防止调用应用程序意外地重用类库所需的配置项。
也就是说,XML配置文件非常方便,所以我找到的最好的折衷办法是使用自定义配置节。您可以将库的配置放在一个XML文件中,该文件由框架自动读取和解析,从而避免了潜在的意外。
您可以在MSDN和Phil Haack has a nice article上了解有关自定义配置节的更多信息。
发布于 2015-02-11 21:50:04
我目前正在为一个零售软件品牌创建插件,它实际上是.net类库。作为一个要求,每个插件都需要使用一个配置文件进行配置。经过一些研究和测试,我编译了以下类。它完美地完成了这项工作。请注意,我没有在我的案例中实现本地异常处理,因为我捕获了更高级别的异常。
在小数和双精度的情况下,可能需要对小数点进行一些调整,但它在我的CultureInfo上工作得很好……
static class Settings
{
static UriBuilder uri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase);
static Configuration myDllConfig = ConfigurationManager.OpenExeConfiguration(uri.Path);
static AppSettingsSection AppSettings = (AppSettingsSection)myDllConfig.GetSection("appSettings");
static NumberFormatInfo nfi = new NumberFormatInfo()
{
NumberGroupSeparator = "",
CurrencyDecimalSeparator = "."
};
public static T Setting<T>(string name)
{
return (T)Convert.ChangeType(AppSettings.Settings[name].Value, typeof(T), nfi);
}
}
App.Config文件示例
<add key="Enabled" value="true" />
<add key="ExportPath" value="c:\" />
<add key="Seconds" value="25" />
<add key="Ratio" value="0.14" />
用法:
somebooleanvar = Settings.Setting<bool>("Enabled");
somestringlvar = Settings.Setting<string>("ExportPath");
someintvar = Settings.Setting<int>("Seconds");
somedoublevar = Settings.Setting<double>("Ratio");
向阴影向导和MattC致敬
发布于 2017-02-02 11:56:35
public class ConfigMan
{
#region Members
string _assemblyLocation;
Configuration _configuration;
#endregion Members
#region Constructors
/// <summary>
/// Loads config file settings for libraries that use assembly.dll.config files
/// </summary>
/// <param name="assemblyLocation">The full path or UNC location of the loaded file that contains the manifest.</param>
public ConfigMan(string assemblyLocation)
{
_assemblyLocation = assemblyLocation;
}
#endregion Constructors
#region Properties
Configuration Configuration
{
get
{
if (_configuration == null)
{
try
{
_configuration = ConfigurationManager.OpenExeConfiguration(_assemblyLocation);
}
catch (Exception exception)
{
}
}
return _configuration;
}
}
#endregion Properties
#region Methods
public string GetAppSetting(string key)
{
string result = string.Empty;
if (Configuration != null)
{
KeyValueConfigurationElement keyValueConfigurationElement = Configuration.AppSettings.Settings[key];
if (keyValueConfigurationElement != null)
{
string value = keyValueConfigurationElement.Value;
if (!string.IsNullOrEmpty(value)) result = value;
}
}
return result;
}
#endregion Methods
}
只是为了做点什么,我把顶部的答案重构成了一个类。其用法类似于:
ConfigMan configMan = new ConfigMan(this.GetType().Assembly.Location);
var setting = configMan.GetAppSetting("AppSettingsKey");
https://stackoverflow.com/questions/5190539
复制相似问题