2015-10-20 7 views
0

Я создал приложение из командной строки и переместил много его config в стандартный файл настроек. Все настройки объявляются как Scope = Application, потому что в логике приложения нет ничего конкретного. Я получаю доступ ко всем значениям кода:app.config - Как заставить нагрузку из файла во время выполнения?

Properties.Settings.Default.<whatever> 

Это работает хорошо, так как оно выполняется автоматически по расписанию. Обновление значений в файле конфигурации отражается на выходе.
Спустя некоторое время я создал базовый графический интерфейс (в том же пространстве имен), чтобы запустить приложение командной строки напрямую (через отдельный конструктор). Я не занимался огромным количеством программирования .Net, но я в основном использую свое приложение CLI, такое как DLL (я не знаю, есть ли у вас подходящий термин: в моей выходной папке мне нужен только GUI. exe, CLI.exe и CLI.exe.config, и он работает). Однако я заметил, что при запуске этого способа файл CLI.exe.config не загружается; приложение CLI использует только свои скомпилированные значения по умолчанию. Я надеялся, что в этом случае будет работать файл config.
Я попытался следующие методы, чтобы заставить загрузки файла конфигурации, но до сих пор обращается пустым:

1:

ConfigurationManager.RefreshSection("appSettings") 

2:

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap(); 
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".exe.config"); 
ConfigurationManager.OpenMappedExeConfiguration(configFile, ConfigurationUserLevel.None).Save(ConfigurationSaveMod.Modified); 
ConfigurationManager.RefreshSection("appSettings"); 

3:

Properties.Settings.Default.Reload(); 

Ничего из этого не вызывают ошибок, но Properties.Settings.Default.Value У меня есть измененный в файле конфигурации не обновляется. Есть ли способ выполнить то, что мне нужно здесь?

Edit: вот пример моего файла CLI.exe.config, если это помогает проиллюстрировать то, что я пытаюсь достичь здесь:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <section name="CLI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> 
    </sectionGroup> 
    </configSections> 
    <connectionStrings/> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <applicationSettings> 
    <CLI.Properties.Settings> 
     <setting name="URLBase" serializeAs="String"> 
     <value>https://cloud.mycompany.com/</value> 
     </setting> 
     <setting name="URLPage" serializeAs="String"> 
     <value>/inventory.aspx#view/Invoice/</value> <!-- This is the value I'm trying to change --> 
     </setting> 
... 

Я должен также упомянуть, что я также пытался «applicationSettings 'вместо' appSettings 'в приведенном выше коде.

+1

'ConfigurationManager.RefreshSection (" appSettings ")' работает для меня. Вы уверены, что app.config действительно обновлен? – Alexander

+0

Пользовательские настройки в 'Properties.Settings' не должны иметь ничего общего с файлом' .config' внутри вашей выходной папки, они хранятся в папке данных локального приложения пользователя. – Groo

+0

GUI.exe будет читать GUI.exe.config не cli.exe.config - это так просто. –

ответ

0

Удостоверьтесь, что модификатор доступа был общедоступным. Запуск с помощью «GetExecutingAssembly» не будет загружать конфигурацию CLI, если он был запущен GUI.EXE, поскольку это IS - исполняющая сборка. посмотрите на это:

Accessing app config across exe's

+0

Изменение модификатора на Public ничего не сделало, я боюсь. – Gargravarr

0

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

Если вы начинаете ваш CLI.exe непосредственно, он будет использовать пользователь файл настроек в подпапках внутри папки локального приложения данных пользователя, аналогичный:

AppData\Local\CLI\CLI.exe\1.2.3.4\user.config 

Однако, если вы используете другую точку входа (CLI.exe) , который ссылается на GUI.exe все вызовы Properties.Settings будет использовать совершенно другой user.config экземпляр, находящийся в (что-то подобное):

AppData\Local\GUI\GUI.exe\1.2.3.4\user.config 

Application- (.exe.config), который помещается в вашу выходную папку, рядом с исполняемым файлом, предоставляет только настройки по умолчанию для этих пользовательских настроек или настроек только для чтения. Разрешить приложению писать в этот файл означало бы, что у него был бы доступ на запись к подпапкам Program Files, что невозможно без повышенных разрешений.

Простейшим решением для получения одинаковых пользовательских настроек при изменении точки входа является копирование файла user.config из папки данных приложения CLI в соответствующую папку для новой точки входа.

(обновление для установки приложений)

Он работает так же для настройки приложения (т.е. .config файлов в папке вывода). Если вы изначально были:

<!-- CLI.exe.config --> 
<configuration> 

    <!-- setting section definitions --> 
    <configSections> 
     <sectionGroup name="userSettings" ... > 
      <section name="CLI.CliSettings" ... /> 
     </sectionGroup> 
     <sectionGroup name="applicationSettings" ... > 
      <section name="CLI.CliSettings" ... /> 
     </sectionGroup> 
    </configSections> 

    <!-- defaults for user settings (runtime changes are stored to appdata) --> 
    <userSettings> 
     <CLI.CliSettings> 
      <setting name="SomeUserCliSetting" serializeAs="String"> 
       <value>Some CLI user setting</value> 
      </setting> 
     </CLI.CliSettings> 
    </userSettings> 

    <!-- application settings (readonly) --> 
    <applicationSettings> 
     <CLI.CliSettings> 
      <setting name="SomeAppCliSetting" serializeAs="String"> 
       <value>Some CLI app setting</value> 
      </setting> 
     </CLI.CliSettings> 
    </applicationSettings> 

</configuration> 

И ваш GUI.exe.config был:

<!-- GUI.exe.config --> 
<configuration> 

    <configSections> 
     <sectionGroup name="userSettings" ... > 
      <section name="GUI.GuiSettings" ... /> 
     </sectionGroup> 
     <sectionGroup name="applicationSettings" ... > 
      <section name="GUI.GuiSettings" ... /> 
     </sectionGroup> 
    </configSections> 

    <userSettings> 
     <GUI.GuiSettings> 
      <setting name="SomeGuiUserSetting" serializeAs="String"> 
       <value>Some GUI user setting</value> 
      </setting> 
     </GUI.GuiSettings> 
    </userSettings> 

    <applicationSettings> 
     <GUI.GuiSettings> 
      <setting name="SomeGuiAppSetting" serializeAs="String"> 
       <value>Some GUI app setting</value> 
      </setting> 
     </GUI.GuiSettings> 
    </applicationSettings> 

</configuration> 

Тогда ваш результирующий файл .config должен содержать все разделы:

<!-- GUI.exe.config -- merged configuration sections --> 
<configuration> 

    <configSections> 
     <sectionGroup name="userSettings" ... > 
      <section name="GUI.GuiSettings" ... /> 
      <section name="CLI.CliSettings" ... /> 
     </sectionGroup> 
     <sectionGroup name="applicationSettings" ... > 
      <section name="GUI.GuiSettings" ... /> 
      <section name="CLI.CliSettings" ... /> 
     </sectionGroup> 
    </configSections> 

    <userSettings> 
     <GUI.GuiSettings> 
      <setting name="SomeGuiUserSetting" serializeAs="String"> 
       <value>Some GUI user setting</value> 
      </setting> 
     </GUI.GuiSettings> 
     <CLI.CliSettings> 
      <setting name="SomeUserCliSetting" serializeAs="String"> 
       <value>Some CLI user setting</value> 
      </setting> 
     </CLI.CliSettings> 
    </userSettings> 

    <applicationSettings> 
     <GUI.GuiSettings> 
      <setting name="SomeGuiAppSetting" serializeAs="String"> 
       <value>Some gui app setting</value> 
      </setting> 
     </GUI.GuiSettings> 
     <CLI.CliSettings> 
      <setting name="SomeAppCliSetting" serializeAs="String"> 
       <value>Some CLI app setting</value> 
      </setting> 
     </CLI.CliSettings> 
    </applicationSettings> 

</configuration> 

(это возможно, я смешали некоторые значения при написании этого, но вы получите идею).

Существует также инструмент, который я нашел в googling: XmlConfigMerge on CodeProject - Я не пробовал, но, предположительно, он делает то же самое автоматически, поэтому вы можете проверить его и включить в свои скрипты сборки.

+0

Кстати, я не использую настройки приложения .NET по многим причинам (например, тот, который вы узнали, или проблемы с версией/обновлением, которые у меня были при публикации новых версий приложений). Например, класс настроек нашей компании загружает и сохраняет настройки в папку/файл данных приложения на основе имени сборки dll, так что каждая сборка имеет свой собственный файл конфигурации.** Но **, заявив, что есть случаи, когда вы хотите, чтобы каждая точка входа имела другой набор параметров для одной и той же сборки, а с настройками .NET вы получаете новый файл 'user.config' для каждой точки входа (содержащий настройки для всех ссылочных сборок). – Groo

+0

Я проверил папки AppData и нет локальных настроек для любого приложения; как я уже отмечал, все настройки - это область приложения, а не область пользователя, поэтому нет необходимости их создавать. Вы говорите, что файл настроек рядом с исполняемым файлом должен предоставлять значения по умолчанию - это именно то, что я хочу, потому что эти значения не будут меняться во время выполнения, но должны быть изменены заранее. Однако этого не происходит. – Gargravarr

+0

@Gargravarr: он работает с настройками приложения, вам просто нужно объединить настройки в файл '.config' для точки входа. Идея настроек .NET app заключается в том, чтобы каждая точка входа имела отдельный набор настроек конфигурации. Проверьте мое редактирование. – Groo

Смежные вопросы