3

我想ConfigurationManager.AppSettings从拥有自己app.config文件的 MEF 插件访问对象中的值。

但是,加载插件后,文件中的密钥app.config不存在。AppSettings加载插件的应用程序的密钥仍然存在。

我注意到使用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

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

有没有办法<appSettings>从插件内部直接访问 MEF 插件?如果没有,有什么推荐的?

4

2 回答 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,并从那里获取值。

于 2012-10-22T09:11:03.950 回答
2

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

于 2012-10-22T08:26:43.677 回答