代码之家  ›  专栏  ›  技术社区  ›  leeeroy

如何从.dll访问应用程序配置?

  •  7
  • leeeroy  · 技术社区  · 16 年前

    我最近在一个.dll中开发了我的WinForm应用程序的一部分。该dll中的一些类 需要获取/存储用户设置。 类只是使用了vs生成的设置文件,所以它只是 Properties.Settings.Default.SomeSetting = var;Properties.Settings.Default.Save() 等。

    现在我把代码移到类库/.dll中,有什么选择呢?

    5 回复  |  直到 12 年前
        1
  •  3
  •   3Dave    16 年前

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

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

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

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

        2
  •  2
  •   Instance Hunter    16 年前

    有一个动态链接库来存储用户设置对我来说没什么意义。DLL是一个库,而不是应用程序,不直接与用户交互。如果DLL中的类需要访问用户设置,可以将它们作为参数传入。

        3
  •  2
  •   Jennifer Zouak    16 年前

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

        4
  •  0
  •   Igor    16 年前

    我不会重新命令它(最好使用您自己的类进行设置),但您可以尝试以下操作:

    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
  •  0
  •   eldarerathis sreeji    12 年前

    对于需要从中读取设置的用户 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;