从MEF插件中读取AppSettings

4
我想从一个具有自己的app.config文件的MEF插件中访问ConfigurationManager.AppSettings对象中的值。
然而,在加载插件后,AppSettings中不存在来自app.config文件的键。应用程序加载插件的键仍然存在。
我注意到使用Settings.settings文件可以通过app.config文件实现此行为,因此该文件必须以某种方式被加载。
我的插件如下:
[Export(IPlugin)]
public class Plugin
{
    public Plugin()
    {
        // reads successfully from app.config via Settings object
        var value1 = Settings.Default["Key1"];

        // returns null from app.config via ConfigurationManager
        var value1 = ConfigurationManager.AppSettings["Key2"]
    }
}

app.config 的格式如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="..." >
      <section name="Plugin.Settings" type="..." />
    </sectionGroup>
  </configSections>

  <appSettings>
    <add key="Key2" value="Fails" />
  </appSettings>

  <applicationSettings>
    <Plugin.Settings>
      <setting name="Key1" serializeAs="String">
        <value>Works</value>
      </setting>
    </Plugin.Settings>
  </applicationSettings>
</configuration>

我可以通过以下方式手动加载app.config文件:

var config = ConfigurationManager.OpenExeConfiguration("Plugin.dll");
var value = AppSettings.Settings["Key2"].Value

但这似乎更像是一种变通方法而不是解决方案。

有没有一种方法可以直接从插件内部访问MEF插件的<appSettings>? 如果没有,那么推荐使用什么方法?

2个回答

9

默认情况下,ConfigurationManager会加载入口程序集的.config文件,即启动当前执行进程的程序集。

正确的做法应该是像这样:

[Export(IPlugin)]
public class Plugin
{
    public Plugin()
    {
        var config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
        var value = config.AppSettings.Settings["Key2"].Value;
    }
}

这将使插件自动打开其编译的DLL的.config文件,并从中获取值。

我明白了。当我调用 Settings.Default 时,这是否是在“幕后”发生的事情? - g t
也许吧。我不确定,但是Reflector肯定可以为此提供一些帮助。 - Stefán Jökull Sigurðarson
从反编译工具中没学到太多,它变得相当复杂了...但是 GetExecutingAssembly() 调用比硬编码 DLL 名称更可取。看起来我会采用这种技术。 - g t
我同意。我认为这比依赖自动生成的Settings.settings要好得多。 - Stefán Jökull Sigurðarson

2

我建议您使用依赖注入工具(如Unity),以便为插件提供所需的配置。通过这种方式,您的插件将不再需要引用System.Configuration.dll。


1
很遗憾,我们无法在当前项目中使用Unity,但它肯定是未来项目中可以使用的东西。 - g t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接