代码之家  ›  专栏  ›  技术社区  ›  Sergio Acosta

如何写入主exe的.config userSettings部分?

  •  6
  • Sergio Acosta  · 技术社区  · 15 年前

    部分 主exe的.config文件

    Winforms 2.0应用程序。

    我有一个设置(一个数据库连接字符串,如果您需要知道的话)具有用户级别的作用域。这意味着每个用户都有一个

    对于第一次运行应用程序的新用户,应用程序的主exe的.config文件在用户设置部分包含默认值。在项目属性的“设置”选项卡中创建设置时,visual studio将创建此部分。

    现在,我想允许计算机中的任何管理员用户能够更改新用户的默认值。只有管理员才有此选项,因为普通用户没有写入主exe的.config文件的权限。

    我已经找到了如何将用户设置写入用户的.config文件,以及如何写入主.config文件的appSettings部分。但是当我试图找出如何写入main.config的userSettings部分时,谷歌搜索失败了

    我唯一的机会是返回System.Xml并在XmlDocument中手动加载.config吗?

    2 回复  |  直到 15 年前
        1
  •  11
  •   Sergio Acosta    15 年前

    经过一些研究,我提出了这个解决方案。它的级别有点低,但仍然需要通过.NET配置API,而无需手动解析.config文件。

    static void SaveUserSettingDefault(string clientSectionName, string settingName, object settingValue)
    {
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    
        // find section group
        ConfigurationSectionGroup group = config.SectionGroups[@"userSettings"];
        if (group == null) return;
    
        // find client section
        ClientSettingsSection clientSection = group.Sections[clientSectionName] as ClientSettingsSection;
        if (clientSection == null) return;
    
        // find setting element
        SettingElement settingElement = null;
        foreach (SettingElement s in clientSection.Settings)
        {
            if (s.Name == settingName)
            {
                settingElement = s;
                break;
            }
        }
        if (settingElement == null) return;
    
        // remove the current value
        clientSection.Settings.Remove(settingElement);
    
        // change the value
        settingElement.Value.ValueXml.InnerText = settingValue.ToString();
    
        // add the setting
        clientSection.Settings.Add(settingElement);
    
        // save changes
        config.Save(ConfigurationSaveMode.Full);
    } 
    

    给定一个包含以下内容的.config:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="MyAssembly.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            </sectionGroup>
        </configSections>
        <userSettings>
            <MyAssembly.Properties.Settings>
                <setting name="SqlConnectionString" serializeAs="String">
                    <value>Server=(local);Database=myDatabase;Integrated Security=true;</value>
                </setting>
            </MyAssembly.Properties.Settings>
        </userSettings>
    </configuration>
    

    if (RunningAsAdmin) // save value in main exe's config file
    {
        SaveUserSettingDefault(@"MyAssembly.Properties.Settings", @"SQLConnectionString", theNewConnectionString);
    }
    else // save setting in user's config file
    {
        Settings.Default. SQLConnectionString = theNewConnectionString;
        Settings.Default.Save();
    }
    
        2
  •  1
  •   Random Dev    15 年前

    我认为是的-手动写入.config文件是唯一的方法。