使用 MEF 时,为我的插件使用 app.config 的正确方法是什么?
What is the correct way to use app.config for my plugin when using MEF?
所以我的主机程序将使用 MEF DirectoryCatalogue
加载到我的插件中
所以目前我有:
Host.exe
和 Plugin1.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 配置,因此更改它没有效果,因此在那种情况下它实际上是硬编码和冗余的。
我在网上阅读发现:
You get one app.config file per executable (EXE, not DLL). The executable launches, creates its AppDomain, and then loads MyApp.exe.config.
但是通过将配置添加到我的 Host.exe
这意味着每当我添加一个新插件时我都必须使用新配置而不是 [=14= 将我的 Host.exe 重新分发给我的客户] 只是动态加载它找到的任何插件。
处理这种情况的正确方法是什么?
首先,让我们区分一下设置和配置。
乍一看,设置和配置很相似,但它们是不同的概念,目的不同。
为简单起见,您可以将配置视为最终用户的只读数据。用户不得(通常不能)更改配置,除非它具有管理权限。例如,需要配置 运行-time 版本,程序集加载的探测路径等。通常,用户无需在此更改任何内容。
另一方面,设置是数据,用户可以更改这些数据以更方便地使用应用程序。用户界面语言,在启动时打开或不打开一些 window,连接字符串(如果应用程序可以从不同的数据源检索数据)——所有这些都是用户设置。
当然,有时很难在这些概念之间定义明确的界限。尽管如此,内置 configuration/settings 机制假定每个可执行文件只有一个 config 文件,但您可以为每个文件定义自定义 settings插件。
因此,如果插件需要一些配置,那么是的,您必须将此配置添加到配置文件(例如,通过创建新的配置部分),并重新分发更改的配置文件(在这种情况下您不需要重新分发可执行文件)。
但是,如果插件需要一些 settings(applicationSettings
提出了一个想法,这是你的情况),那么定义自定义设置类型就足够了(例如,在插件的项目中添加设置)。然后,在 运行 时,您只需保存更改设置 - 框架将完成剩下的工作:它将找到设置文件,并更新它。在这种情况下,您不需要更新和重新分发配置文件。
注意,设置文件和配置文件是不同的文件;设置文件位于用户可以更改它的地方 (%UserProfile%\AppData*)。
所以我的主机程序将使用 MEF DirectoryCatalogue
所以目前我有:
Host.exe
和 Plugin1.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 配置,因此更改它没有效果,因此在那种情况下它实际上是硬编码和冗余的。
我在网上阅读发现:
You get one app.config file per executable (EXE, not DLL). The executable launches, creates its AppDomain, and then loads MyApp.exe.config.
但是通过将配置添加到我的 Host.exe
这意味着每当我添加一个新插件时我都必须使用新配置而不是 [=14= 将我的 Host.exe 重新分发给我的客户] 只是动态加载它找到的任何插件。
处理这种情况的正确方法是什么?
首先,让我们区分一下设置和配置。
乍一看,设置和配置很相似,但它们是不同的概念,目的不同。
为简单起见,您可以将配置视为最终用户的只读数据。用户不得(通常不能)更改配置,除非它具有管理权限。例如,需要配置 运行-time 版本,程序集加载的探测路径等。通常,用户无需在此更改任何内容。
另一方面,设置是数据,用户可以更改这些数据以更方便地使用应用程序。用户界面语言,在启动时打开或不打开一些 window,连接字符串(如果应用程序可以从不同的数据源检索数据)——所有这些都是用户设置。
当然,有时很难在这些概念之间定义明确的界限。尽管如此,内置 configuration/settings 机制假定每个可执行文件只有一个 config 文件,但您可以为每个文件定义自定义 settings插件。
因此,如果插件需要一些配置,那么是的,您必须将此配置添加到配置文件(例如,通过创建新的配置部分),并重新分发更改的配置文件(在这种情况下您不需要重新分发可执行文件)。
但是,如果插件需要一些 settings(applicationSettings
提出了一个想法,这是你的情况),那么定义自定义设置类型就足够了(例如,在插件的项目中添加设置)。然后,在 运行 时,您只需保存更改设置 - 框架将完成剩下的工作:它将找到设置文件,并更新它。在这种情况下,您不需要更新和重新分发配置文件。
注意,设置文件和配置文件是不同的文件;设置文件位于用户可以更改它的地方 (%UserProfile%\AppData*)。