Mono не может сохранить пользовательские настройки

У меня проблемы с сохранением пользовательских настроек на Mono (Ubuntu). Вот пример кода:

private void Form1_Load(object sender, EventArgs e)
{
    string savedText = Properties.Settings.Default.tbText.ToString();
    tbInput.Text = savedText;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    string textToSave = tbInput.Text;
    Properties.Settings.Default.tbText = textToSave;
    Properties.Settings.Default.tbText = Properties.Settings.Default.tbText;
    Properties.Settings.Default.Save();
}

Но я получаю только пустой конфиг, как

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <userSettings />
</configuration>

Я уже пробовал что-то вроде

Properties.Settings.Default.tbText = Properties.Settings.Default.tbText;

отсюда Но все же получить тот же результат. Как я могу использовать настройки в Mono?

1 ответ

Решение
  1. Удалить строку

    Properties.Settings.Default.tbText = Properties.Settings.Default.tbText;
    
  2. Проверьте ваш файл конфигурации приложения. Вероятно, у вас есть что-то вроде этого:

    <configuration>
      <configSections>
        <sectionGroup name="userSettings" 
                      type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
          <section name="ExampleApp.Properties.Settings" 
                   type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
      </configSections>
      ...
      <appSettings>
        <add key="TestKey1" value="Test1" />
        <add key="TestKey2" value="Test2" />
      </appSettings>
      ...
      <userSettings>
        <ExampleApp.Properties.Settings>
          <setting name="textBox1" serializeAs="String">
            <value />
          </setting>
        </ExampleApp.Properties.Settings>
      </userSettings>
    </configuration>
    

    Удалить раздел Group для пользовательских настроек.

    <sectionGroup name="userSettings" 
                  type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="ExampleApp.Properties.Settings" 
                 type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
    

    Удалите также раздел userSettings.

    <userSettings>
      ...
    </userSettings>
    
  3. Удалите свой локальный user.config. После первого запуска он будет воссоздан правильно.

    Он должен работать

У меня были проблемы с этим, и советы PiKos мне не помогли. Мой был таким же, как и вы:

У меня был AppName.exe.config рядом с моим AppName.exe, и в нем были такие данные, как:

  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="AppName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <userSettings>
    <AppName.Properties.Settings>
      <setting name="X" serializeAs="String">
        <value>0</value>
      </setting>
    </AppName.Properties.Settings>
  </userSettings>

У меня был ~/.local/share/CompanyName/AppName_4309857324572934859834/user.config что так же эффективно пусто:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <userSettings />
</configuration>

Обратите внимание, что это sectionGroup не имеет детей, кроме одного в AppName.exe.config сделал

Решением для меня было вырезать соответствующие <sectiongroup> плюс его ребенок, а также <userSettings> снаружи AppName.exe.config и вставьте их в пустой user.config


Похоже, моно ожидает, что они будут только в одном месте. Если они вappname.exe.cofnigвы получите пустой user.config. Если они находятся в user.config, они будут обновлены там при вызове Save(). Обратной стороной этого, как мне кажется, является то, что, если user.config когда-либо будет поврежден, нигде не будет никаких настроек по умолчанию (я попробовал совет PiKos удалить их изAppName.exe.configа также удалите user.config и перезапустите приложение; user.config был создан со всеми именами настроек, но все значения были нулевыми)

Другие вопросы по тегам