【问题标题】:Accessing the configuration file across application domain跨应用程序域访问配置文件
【发布时间】:2015-06-02 07:58:24
【问题描述】:

我们正在为我们的应用程序实现一个即插即用模块,用户可以在运行时加载和卸载所需的类库。所以我决定使用 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
}

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

【问题讨论】:

    标签: c# mef


    【解决方案1】:

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

    因此,您可以像这样为您的插件 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;
    

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

    【讨论】:

    • 我希望用户在我的主应用程序中编辑插件 DLL 的 app.config 文件的内容。我可以使用插件 DLL 加载它。我想要的是从主应用程序编辑它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多