我想从MEF插件访问ConfigurationManager.AppSettings
对象中的值,该插件有自己的app.config
文件。
但是,加载插件后,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
但这似乎更像是一种解决方法,而不是解决方案。
有没有办法直接从插件中访问MEF插件的<appSettings>
?
如果没有,推荐什么?
答案 0 :(得分: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,并从那里获取值。
答案 1 :(得分:2)
我建议您使用像Unity这样的依赖注入工具,以便为您的插件提供所需的配置。通过这种方式继续,您的插件将不再需要引用System.Configuration.dll。