Класс ConfigurationManager. Свойства конфигурационной секции не могут быть отредактированы при блокировке

#c# #.net-5 #configurationmanager

Вопрос:

Вот код:

 // These is works
Console.WriteLine(Properties.Settings.Default.name);

Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
KeyValueConfigurationCollection settings = configFile.AppSettings.Settings;
settings.Add("Port", "12");
// Here it fails
configFile.Save(ConfigurationSaveMode.Modified);
 

Содержимое файла app.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="ConsoleApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
        </sectionGroup>
    </configSections>
    <userSettings>
        <ConsoleApplication1.Properties.Settings>
            <setting name="name" serializeAs="String">
                <value>dasdqweqw</value>
            </setting>
        </ConsoleApplication1.Properties.Settings>
    </userSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>
 

Не могу понять, почему он не работает. Код правильный или я делаю что-то не так? В строке configFile.Сохранить(ConfigurationSaveMode.Изменено); он выдает исключение «Свойства конфигурационной секции не могут быть отредактированы при блокировке».

Какому сценарию я решил следовать: 1. Через обозреватель решений я открываю страницу свойств проекта (обозреватель решений> контекстное меню узла проекта> Свойства), затем через вкладку Настроек на странице свойств проекта я создаю настройки приложения проекта (значение параметра Scope — Пользователь). Это создает класс свойств (находится в Настройках.Файл Designer.cs) в пространстве имен проекта и соответствующих свойствах класса. https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/cftf714c(v=vs.90) 2. Чтобы создать пользовательский файл user.config, мне нужно изменить добавленные настройки и свойства вызова.Настройки.По умолчанию.Метод Save() . Если я просто вызываю свойства.Настройки.По умолчанию.Save() без изменения настроек сначала это не создает файл user.config.

Пример использования:

 Properties.Settings.Default.updateTime = DateTime.UtcNow;
Properties.Settings.Default.Save();

Console.WriteLine((Properties.Settings.Default.updateTime - DateTime.UtcNow).Hours);
Console.ReadLine();
 

Содержимое файла user.config:

 <?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <coonfoo.Properties.Settings>
            <setting name="updateTime" serializeAs="String">
                <value>06/03/2018 10:42:03</value>
            </setting>
        </coonfoo.Properties.Settings>
    </userSettings>
</configuration>
 

Комментарии:

1. Я думаю, вы делаете это правильно, единственное изменение, которое вам нужно, — это получить правильный конфигурационный файл. Вам нужно изменить exe.config файл. Способ сделать это — использовать ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location) то, что должно работать

Ответ №1:

Это должно сработать.

 class Program
{
    static void Main(string[] args)
    {
        Configuration roaming = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = roaming.FilePath;
        Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
        KeyValueConfigurationCollection settings = configuration.AppSettings.Settings;
        settings.Add("Port", "12");
        configuration.Save(ConfigurationSaveMode.Modified);
    }
}
 

Нашел это, что может вам помочь.