Как написать в основной пользовательский раздел exe-файла .config? - PullRequest
6 голосов
/ 10 марта 2009

Есть ли какой-либо поддерживаемый API в .NET 2.0 для записи в userSettings раздела файла .config основного exe ?

Сценарий:

Приложение Winforms 2.0.

У меня есть параметр (строка подключения к базе данных, если вам нужно знать), который имеет область действия на уровне пользователя. Это означает, что у каждого пользователя есть файл user .config, созданный .net, когда пользователь сохраняет значение параметра.

Для новых пользователей, которые запускают приложение в первый раз, файл .config основного исполняемого файла приложения содержит значение по умолчанию в разделе пользовательских настроек. Этот раздел создается Visual Studio при создании параметра на вкладке «Настройки» свойств проекта.

Теперь я хочу, чтобы любой пользователь-администратор на компьютере мог изменять значение по умолчанию для новых пользователей. Только администраторы будут иметь эту опцию, потому что обычные пользователи не имеют разрешения на запись в файл .config главного exe в любом случае.

Я нашел, как записать пользовательские настройки в пользовательский файл .config и как записать в раздел appSettings основного файла .config. Но мой поиск не помог, когда я попытался выяснить, как записать в раздел userSettings основной .config

Мой единственный шанс вернуться к System.Xml и вручную загрузить файл .config в XmlDocument?

Ответы [ 2 ]

10 голосов
/ 10 марта 2009

После некоторых исследований я придумал это решение. Это немного низкий уровень, но он все еще проходит через API конфигурации .NET без необходимости анализа файла .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();
}
1 голос
/ 10 марта 2009

Я думаю, что да - ручная запись в файл .config - единственный способ. Или вы можете позволить администратору самостоятельно редактировать .config-файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...