首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >等效于库(DLL)的“app.config”

等效于库(DLL)的“app.config”
EN

Stack Overflow用户
提问于 2011-03-04 14:40:02
回答 11查看 172.4K关注 0票数 155

是否有等同于库(DLL)的app.config?如果不是,存储特定于库的配置设置的最简单方法是什么?请考虑到该库可能在不同的应用程序中使用。

EN

回答 11

Stack Overflow用户

发布于 2011-03-04 15:40:17

配置文件是应用程序范围的,而不是程序集范围的。因此,您需要将库的配置部分放入正在使用库的每个应用程序的配置文件中。

也就是说,从应用程序的配置文件中获取配置并不是一种好的做法,特别是在类库中的appSettings部分。如果您的库需要参数,那么调用您的库的任何人都应该将它们作为方法参数传递给构造函数、工厂方法等。这可以防止调用应用程序意外地重用类库所需的配置项。

也就是说,XML配置文件非常方便,所以我找到的最好的折衷办法是使用自定义配置节。您可以将库的配置放在一个XML文件中,该文件由框架自动读取和解析,从而避免了潜在的意外。

您可以在MSDNPhil Haack has a nice article上了解有关自定义配置节的更多信息。

票数 9
EN

Stack Overflow用户

发布于 2015-02-11 21:50:04

我目前正在为一个零售软件品牌创建插件,它实际上是.net类库。作为一个要求,每个插件都需要使用一个配置文件进行配置。经过一些研究和测试,我编译了以下类。它完美地完成了这项工作。请注意,我没有在我的案例中实现本地异常处理,因为我捕获了更高级别的异常。

在小数和双精度的情况下,可能需要对小数点进行一些调整,但它在我的CultureInfo上工作得很好……

代码语言:javascript
复制
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文件示例

代码语言:javascript
复制
<add key="Enabled" value="true" />
<add key="ExportPath" value="c:\" />
<add key="Seconds" value="25" />
<add key="Ratio" value="0.14" />

用法:

代码语言:javascript
复制
  somebooleanvar = Settings.Setting<bool>("Enabled");
  somestringlvar = Settings.Setting<string>("ExportPath");
  someintvar =     Settings.Setting<int>("Seconds");
  somedoublevar =  Settings.Setting<double>("Ratio");

向阴影向导和MattC致敬

票数 5
EN

Stack Overflow用户

发布于 2017-02-02 11:56:35

代码语言:javascript
复制
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
}

只是为了做点什么,我把顶部的答案重构成了一个类。其用法类似于:

代码语言:javascript
复制
ConfigMan configMan = new ConfigMan(this.GetType().Assembly.Location);
var setting = configMan.GetAppSetting("AppSettingsKey");
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5190539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档