C# 使用MEF时,我的插件使用app.config的正确方法是什么?

C# 使用MEF时,我的插件使用app.config的正确方法是什么?,c#,configuration,app-config,mef,C#,Configuration,App Config,Mef,因此,我有我的主机程序,它将使用MEF directorycontalog 因此,目前我有: Host.exe和Plugin1.dll Plugin1.dll在其自己的配置中设置了一个配置设置(Plugin1.dll.config): 现在的问题是,这是一个.dll配置,因此更改它没有任何效果,因此在这种情况下,它实际上是硬编码和冗余的 在网上阅读时,我发现: 每个可执行文件(EXE,而不是DLL)有一个app.config文件。可执行文件启动,创建其AppDomain,然后加载MyApp.ex

因此,我有我的主机程序,它将使用
MEF directorycontalog

因此,目前我有:

Host.exe
Plugin1.dll

Plugin1.dll在其自己的配置中设置了一个配置设置
(Plugin1.dll.config)

现在的问题是,这是一个.dll配置,因此更改它没有任何效果,因此在这种情况下,它实际上是硬编码和冗余的

在网上阅读时,我发现:

每个可执行文件(EXE,而不是DLL)有一个app.config文件。可执行文件启动,创建其AppDomain,然后加载MyApp.exe.config

但是,通过将配置添加到我的
Host.exe
这意味着每当我添加新插件时,我都必须使用新配置将我的Host.exe重新分发到我的客户端,而不是
Host.exe
动态加载它找到的任何插件


处理这种情况的正确方法是什么?

首先,让我们区分设置和配置。
乍一看,设置和配置非常相似,但它们是具有不同用途的不同概念

为简单起见,您可以将配置视为最终用户的只读数据。除非用户具有管理权限,否则用户不得(通常不能)更改配置。例如,配置是运行时版本所必需的,探测程序集加载的路径等。通常情况下,此处的用户无需更改任何内容

另一方面,设置是用户可以更改的数据,以使使用应用程序更加方便。用户界面语言、在启动时打开或不打开某些窗口、连接字符串(若应用程序可以从不同的数据源检索数据)——所有这些都是用户设置

当然,有时很难定义这些概念之间的明确界限。尽管如此,内置的配置/设置机制假定每个可执行文件只有一个配置文件,但可以为每个插件定义自定义设置

所以,如果插件需要一些配置,那么是的,您必须将此配置添加到配置文件中(例如,通过创建新的配置节),并重新分发更改的配置文件(在这种情况下,您不需要重新分发可执行文件)

但是,如果插件需要一些设置(
applicationSettings
提出了一个想法,这就是您的情况),那么定义自定义设置类型(例如,在插件的项目中添加设置)就足够了。然后,在运行时,您只需保存更改设置—框架将完成其余工作:它将查找设置文件,并对其进行更新。在这种情况下,您不需要更新和重新分发配置文件


注意,设置文件和配置文件是不同的文件;设置文件位于用户可以更改它的位置(%UserProfile%\AppData*)。

嗨,丹尼斯。你能回答这个问题吗:?
<applicationSettings>
        <Plugin1.Settings>
            <setting name="MyString" serializeAs="String">
                <value>Hello</value>
            </setting>
        </Plugin1.Settings>
</applicationSettings>
var myString = Settings.Default.MyString;