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

时间:2015-06-05 08:08:17

标签: c# configuration app-config mef

所以我的主机程序将使用MEF DirectoryCatalogue

加载到我的插件中

所以目前我有:

Host.exePlugin1.dll

Plugin1.dll在其自己的配置(Plugin1.dll.Config)中设置了配置设置:

<applicationSettings>
        <Plugin1.Settings>
            <setting name="MyString" serializeAs="String">
                <value>Hello</value>
            </setting>
        </Plugin1.Settings>
</applicationSettings>

使用以下方法在Plugin1中访问:

var myString = Settings.Default.MyString;

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

在互联网上阅读我发现:

  

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

但是通过将配置添加到我的Host.exe这意味着当我添加新插件时,我必须使用新配置而不是Host.exe将我的Host.exe重新分发给我的客户端,只需动态加载无论发现什么插件。

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

1 个答案:

答案 0 :(得分:2)

首先,让我们将设置配置区分开来。
初看起来,设置和配置非常相似,但它们是不同用途的不同概念。

为简单起见,您可以将配置视为最终用户的只读数据。除非具有管理权限,否则用户不得(通常也不能)更改配置。例如,配置是运行时版本,装配加载的探测路径等。通常,这里的用户没有任何改变。

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

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

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

但是,如果插件需要一些设置applicationSettings建议一个想法,这就是你的情况),那么就足以定义自定义设置类型(例如,在插件中添加设置)项目)。然后,在运行时,您只需要保存更改设置 - 框架将完成剩下的工作:它将找到设置文件,并将更新它。在这种情况下,您无需更新和重新分发配置文件。

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