跨应用程序域访问配置文件

Ram*_*rai 6 c# mef

我们正在为我们的应用程序实现即插即用模块,用户可以在运行时加载和卸载所需的类库.所以我决定使用MEF和类库的影子复制.

这里的事情是每个类库可能具有需要由用户设置的不同配置属性.我的主应用程序不了解类库中的配置.

现在问题是当我尝试将加载了类库的应用程序配置文件从一个应用程序域传输到另一个应用程序域时.

没有MEF,我刚从Settings.Default类库中返回,我在主应用程序中使用它来编辑设置.使用MEF和阴影复制,它似乎不起作用,因为

  1. 对象类型需要双方都知道.
  2. 我无法MarshalByRefObject在设置文件上实现,因为设置文件已经扩展ApplicationSettingsBase,这是一个抽象类,而c#不支持多重继承.

目前我正在创建一个类,它将所有属性保存为字符串,并根据此类内容在主应用程序中创建GUI.

public class ExtensionModuleConfiguration : MarshalByRefObject
{
    public string Name { get; set; }   
    public string Value { get; set; }
    public List<string> Options { get; set; }
    public UIElements ToolUIElement { get; set; }
}

public enum UIElements
{
    ComboBox,
    TextBox
}
Run Code Online (Sandbox Code Playgroud)

我必须说这不是最好的解决方案.有人可以建议一种更好的方法来设置MEF中类库的配置吗?

Prz*_*ski 0

有两种方法可以做到这一点。您必须通知 .NET 应将哪个 app.config 加载到 MEF 插件类的 appdomain 中。

因此,您可以为您的插件 DLL 指定特定的 app.config,如下所示:

ConfigurationManager.OpenExeConfiguration("Plugin.dll");
var name = AppSettings.Settings["Name"].Value;
Run Code Online (Sandbox Code Playgroud)

或者您可以加载主应用程序 DLL 的 app.config 并将所有应用程序设置放入该文件中。在这种情况下你应该这样做:

var config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
var name = config.AppSettings.Settings["Name"].Value;
Run Code Online (Sandbox Code Playgroud)

这两种解决方案都应该从插件实现内部调用,例如在构造函数中。或者通过首先调用某些延迟加载的配置属性。