#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);
}
}
Нашел это, что может вам помочь.