【问题标题】:How to access app configuration from a .dll?如何从 .dll 访问应用程序配置?
【发布时间】:2014-02-21 06:40:35
【问题描述】:

我最近在 .dll 中破解了我的 winform 应用程序的一部分。该dll中的一些类 想要获取/存储用户设置。 这些类只是使用了 VS 生成的设置文件,所以它只是做了 Properties.Settings.Default.SomeSetting = var;Properties.Settings.Default.Save()

现在我将该代码移到类库/.dll 中,我有哪些选择?

【问题讨论】:

  • 您是在寻找访问以前设置的方法,还是认为类库不能有 app.config 文件?
  • 我不知道我在寻找什么,这就是我问的原因。我无法让我的 dll 访问其单独的 app.config,clickonce 部署表单也不包含 .dll 的设置文件。

标签: c# .net configuration


【解决方案1】:

宿主应用程序应该处理配置文件的接口,而不是 DLL。要么

  1. 将需要在 DLL 中读取/修改的任何设置作为参数传递,或者

  2. 传入可由 DLL 修改的名称-值设置集合,并在控制权返回调用应用程序时将 DLL 所做的任何更改保存到集合中。

这在原理上类似于从分层应用程序的业务层中删除数据库接口并将其封装到数据层中。

【讨论】:

    【解决方案2】:

    拥有一个 DLL 存储用户设置对我来说没有多大意义。 DLL 是一个库,而不是应用程序,并且不直接与用户交互。如果 DLL 中的类需要访问用户设置,您可以将它们作为参数传递。

    【讨论】:

    • DLL 不仅仅是库。您的 DLL 是插件,并且具有不同的接口,可以在主应用程序运行时进行热交换。如果插件需要网络凭据或类似的东西,您需要 DLL 才能将配置集读取到主应用程序中。您不要更改数千个插件的构造函数,因为其中一个需要额外的值
    • 关注点分离呢?不是所有的库都应该管理自己的配置吗?我认为他们应该这样做。
    【解决方案3】:

    Properties 类是自动生成的。它实际上是配置文件的包装器。如果您不想更改设计,只需进入代码并将其复制到您的 DLL 中。但请记住,它将不再被神奇地维护(重新生成)。或者您可以使用 ConfigurationManager 直接获取配置文件。

    【讨论】:

      【解决方案4】:

      我不会推荐它(最好使用你自己的类进行设置),但你可以试试这个:

      string sectionName = "applicationSettings/" + 
                  appName + ".Properties.Settings";
               System.Configuration.ClientSettingsSection section = 
                  (System.Configuration.ClientSettingsSection)
                   System.Configuration.ConfigurationManager.GetSection(sectionName);
               foreach (SettingElement setting in section.Settings)
               {
                  string value = setting.Value.ValueXml.InnerText;
                  string name = setting.Name;
                  if (name.ToLower().StartsWith(searchName.ToLower()))
                  {
                     return value;
                  }
               }
      

      【讨论】:

        【解决方案5】:

        对于那些需要从userDirectory/user.config读取设置的人,这里有一个解决方案:

        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        ConfigurationSectionGroup userSettings = config.GetSectionGroup("userSettings");
        ClientSettingsSection settings = (ClientSettingsSection)userSettings.Sections.Get("[applicationName].Properties.Settings");
        SettingElement elem = settings.Settings.Get([settingName]);
        var sett = elem.Value.ValueXml.InnerText;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          相关资源
          最近更新 更多