Использование ConfigurationManager

Я написал следующий код, чтобы получить данные ConfigurationManager и обновить их:

private static void UpdateConfigurationFile()
{
#if DEBUG
    string applicationName =
        Environment.GetCommandLineArgs()[0];
#else 
   string applicationName =
  Environment.GetCommandLineArgs()[0]+ ".exe";
#endif

    string exePath = System.IO.Path.Combine(
        Environment.CurrentDirectory, applicationName);

    // Get the configuration file. The file name has 
    // this format appname.exe.config.
    System.Configuration.Configuration config =
      ConfigurationManager.OpenExeConfiguration(exePath);

    string server = ConfigurationManager.AppSettings["server"];
}

В конце кода сервер пуст.

XML имеет соответствующий код сервера:

<applicationSettings>
    <forLiDAR.Properties.Settings>
        <setting name="Server" serializeAs="String">
            <value>localhost</value>
        </setting>

Что я делаю неправильно?

1 ответ

Хорошо, у меня есть решение вашей проблемы.

Это нелегко объяснить, так как на самом деле это не ваша вина, у VS есть ошибка, которая тянется с ней уже много лет.

Итак, давайте сделаем это шаг за шагом:

  1. Добавление настроек с помощью щелчка правой кнопкой мыши по проекту и перехода на вкладку настроек - неверный путь для следования... вот почему:

Если мы следуем документации, все, что нам нужно сделать, это:

Properties.Settings.Default.Server = "Now I'm something different than localhost";
Properties.Settings.Default.Save();

Не нужно OpenExeConfigration или что-то еще, только эти две строки! и.NET, как брелок, должен иметь возможность сохранять новый параметр в файле конфигурации... за исключением того, что он этого не делает:) Вместо этого он выкрикивает: "Системе конфигурации не удалось инициализировать"!!

Итак... мы думаем "хорошо, они не охватили все это в документации... давайте добавим то, что, по нашему мнению, отсутствует...", и поэтому мы добавим:

var exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "ConsoleApplication58.vshost.exe.config");
var config = ConfigurationManager.OpenExeConfiguration(exePath);
var oldSetting = config.AppSettings.Settings["Server"].Value;

И мы получим... еще одно исключение - нулевая ссылка на этот раз. Поэтому мы спрашиваем - "что там происходит?!" и из отладки мы добавляем watch для 'config.AppSettings.Settings' и к нашему ужасу видим, что.NET на самом деле пытается сказать нам "Ложки нет..." (или количество настроек равно 0)

Таким образом, на данный момент мы можем заключить, что это дерьмо определенно не работает с приложением, которое использует AppConfig... но оно может работать с приложениями, которые используют WebConfig - я этого не проверял. (о, просто чтобы прояснить: "Это дерьмо" означает добавление файла настроек с помощью щелчка правой кнопкой мыши на меню проекта и перехода на вкладку настроек)

  1. Хорошо... давайте попробуем другой способ сделать это, а именно Добавление файла настроек из меню Добавить новый элемент, его именем по умолчанию будет "settings1.settings", и оно будет находиться под общим именем папки проекта, а не свойства, как и раньше.

Поэтому я тоже это сделал и проверил следующие строки:

var oldSetting = Settings1.Default.Server;
Settings1.Default.Server = "localhost2";
Settings1.Default.Save();

Это сработало - но я должен сказать вам, что "Scope" должен быть "user", а не "Application"... если в его "application" настройка не будет иметь установщика... и где он сохранил информацию? в папке AppData для этого пользователя.. что логично.

Это, конечно, означает, что для проверки вручную во время отладки того, что было сохранено, вам нужно перейти в файл конфигурации вашего приложения, который находится в папке AppData, а не в папке debug/bin.

  1. Но все это, конечно, не то, что вы просили... Потому что вы хотите сохранить настройку области приложения - правильно? Ну.. ты не можешь - они не предназначены для этого. Вы можете прочитать здесь: https://msdn.microsoft.com/en-us/library/aa730869(v=vs.80).aspx

Класс ApplicationSettings не поддерживает сохранение настроек в файл app.config. Это очень задумано, приложения, которые запускаются с должным образом защищенной учетной записью пользователя (например, Vista UAC), не имеют доступа для записи в папку установки программы.

Вы можете бороться с системой с помощью класса ConfigurationManager. Но тривиальный обходной путь заключается в том, чтобы зайти в конструктор настроек и изменить область настройки на "Пользователь". Если это вызывает затруднения (скажем, настройка важна для каждого пользователя), вам следует поместить функцию "Параметры" в отдельную программу, чтобы вы могли запросить запрос на повышение привилегий. Или отказаться от использования настроек.

Итак, в заключение я постараюсь показать вам, как должно выглядеть ваше приложение:

namespace ConsoleApplication58
{
    class Program
    {
        static void Main(string[] args)
        {
            UpdateConfigurationFile();
        }

        private static void UpdateConfigurationFile()
        {
            var oldSetting = Settings1.Default.Server; //to get the current setting if you want..
            Settings1.Default.Server = "localhost2"; //to change the setting.
            Settings1.Default.Save(); //to save settings.
        }
    }
}

И при условии, что вы добавили файл Settings1.Settings, как я уже говорил, вот как appConfig может выглядеть:

<?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" >
            <section name="ConsoleApplication58.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>

    <userSettings>
        <ConsoleApplication58.Settings1>
            <setting name="Server" serializeAs="String">
                <value>localhost</value>
            </setting>
        </ConsoleApplication58.Settings1>
    </userSettings>
</configuration>

В соответствии с просьбой в комментарии здесь есть ссылка на отчет об ошибке:
Конфигурация в App.Config и ApplicationSettings

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