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

时间:2015-06-02 07:58:25

标签: c# mef

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

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

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

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

  1. 双方都需要了解对象类型。
  2. 因为我无法在设置文件上实现MarshalByRefObject 设置文件已经扩展ApplicationSettingsBase 是一个抽象类,c#不支持多重继承。
  3. 目前我正在创建一个类,它将所有属性保存为字符串,并根据此类内容在主应用程序中创建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
    }
    

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

1 个答案:

答案 0 :(得分:0)

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

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

ConfigurationManager.OpenExeConfiguration("Plugin.dll");
var name = AppSettings.Settings["Name"].Value;

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

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

两个解决方案都应该从你的插件实现中调用,例如在构造函数中。或者首先调用一些延迟加载的配置属性。