Один app.config мультипроектный C#

Я хочу использовать один app.config для 3 разных проектов.

Как получить доступ к настройкам?

ConfigurationManager.AppSettings["config1"]

7 ответов

Решение

Общий конфигурационный файл

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section 
            name="appSettings" 
            type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
            />
    </configSections>
    <appSettings>
        <add key="key1" value="value1"/>
    </appSettings>
</configuration>

Доступ к сопоставленному файлу конфигурации

ConfigurationFileMap fileMap = new ConfigurationFileMap(file); //Path to your config file
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
string value = configuration.AppSettings.Settings["key1"].Value;

Допустим, у вас есть эта структура папок:

  • Решение
    • Project1
    • Проект2
    • Project3

Сделай это:

  1. Создайте файл App.config в папке уровня решения. Вы не найдете опции для добавления файла App.config из шаблонов, поэтому просто создайте новый пустой текстовый файл с именем App.config и вставьте содержимое обычного файла App.config.
  2. Для каждого проекта в обозревателе решений:

    1. Щелкните правой кнопкой мыши и выберите Add > Existing Item
    2. Найдите файл
    3. Выбрать Add as link из выпадающего списка рядом с Add кнопка.

      Добавить как ссылку

Отредактировано, чтобы добавить:

Вы правильно утверждаете, что вышеупомянутый метод только поделился файлом до времени сборки. Чтобы использовать общий файл во время выполнения, см. Ответы на этот вопрос.

Вот диалог "Добавить существующий элемент" в VS 2008:

http://i27.tinypic.com/72bwo6.jpg

Нажмите на маленький выпадающий индикатор на кнопке "Добавить" и выберите "Добавить как ссылку" в контекстном меню.

Марк

Я нашел кнопку и открыл app.config как ссылку, однако это вызвало при сборке повторное создание отдельного файла конфигурации для каждого проекта, и, следовательно, при развертывании 3 проекта у меня будет 3 файла конфигурации. Я хотел сохранить один файл для всех проектов в определенном решении. Могу ли я сделать это?

Да, ты можешь сделать это, но должен ли ты сделать это?

Основным предположением в приложении.NET является то, что одно приложение = один файл конфигурации. Из коробки и простым способом вы не можете делиться файлами конфигурации между приложениями.

Если вы создадите свои собственные пользовательские разделы конфигурации, вы можете "перенести" их на внешние файлы, которыми можно поделиться. Представьте, что вы создаете свой собственный раздел конфигурации под названием "MyConfiguration", тогда ваш app.config будет выглядеть примерно так:

<configuration>
  <configSections>
    <section name="MyConfiguration" 
             type="MyConfigurationSection, MyConfigurationAssembly" />
  </configSections>

  <MyConfiguration>
    <nestedElement>
      <dateTimeValue>10/16/2006</dateTimeValue>
      <integerValue>1</integerValue>
    </nestedElement>
  </MyConfiguration>
</configuration>

Вы можете иметь раздел "MyConfiguration" в своем собственном файле и ссылаться на него из конфигурации вашего приложения:

<configuration>
  <configSections>
    <section name="MyConfiguration" 
             type="MyConfigurationSection, MyConfigurationAssembly" />
  </configSections>

  <MyConfiguration configSource="MyConfiguration.config" />
</configuration>

и ваш "MyConfiguration.config" будет содержать:

  <MyConfiguration> 
    <nestedElement>
      <dateTimeValue>10/16/2006</dateTimeValue>
      <integerValue>1</integerValue>
    </nestedElement>
  </MyConfiguration>

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

Для получения дополнительной информации и превосходного знакомства с.NET 2.0 и более поздними загадками конфигурации см. Серию из трех статей о настройке.NET 2.0, посвященную Jon Rista, в CodeProject.

Настоятельно рекомендуется, хорошо написано и очень полезно!

Марк

Я понимаю, что это старый вопрос, но для этого есть гораздо более простой способ. Если вы используете Visual Studio 2008 или выше, существует тип проекта, который называется "Общий проект".

VS2015 C# Общий проект

Общий проект может содержать практически все, что могут содержать другие типы проектов. Это не только для C#, но и для всех языков, которые поддерживает VS2015. Когда что-то включено в Общий проект, оно становится доступным для других проектов после добавления ссылки на него (см. Ниже).

Основное отличие классов в общем проекте от общей библиотеки заключается в том, что при компиляции программы все содержимое общего проекта будет скомпилировано непосредственно в ваш проект, а не в виде отдельного файла (.dll,.exe). Думайте об этом, как будто все, что находится в общем проекте, вставлено в другие проекты. Вот небольшой учебник по настройке и использованию:

Visual Studio 2015 - руководство по общедоступному проекту:

Создайте новый общий проект, выбрав File->New->Project или щелкните правой кнопкой мыши Solution в обозревателе решений и выберите Add-> New Project. Когда появится диалоговое окно, выберите "Общий проект", дайте проекту имя TestShared в этом примере.

Добавить общий проект

После добавления нового проекта вы можете добавить все, что вам нужно, чтобы быть доступным для других проектов. В этом случае мы добавим app.config. Щелкните правой кнопкой мыши Shared Project и выберите Add-> New Item. Выберите Visual C#->Data->XML File, назвав его явно в app.config.

app.config

Наконец, добавьте ссылку на Shared Project, щелкнув правой кнопкой мыши на Project, с которым вам нужно поделиться проектом, и выберите Add->Reference. В диалоговом окне "Диспетчер ссылок" выберите свой общий проект, он будет отображаться в разделе "Общие проекты" слева.

Добавить ссылку

Теперь все, что находится в общем проекте, доступно в другом проекте, нет необходимости делать какие-либо операции импорта или что-то в этом роде. Это просто работает. Этот шаблон очень удобен, когда вы разрабатываете программу и вам нужно иметь несколько различных графических интерфейсов (Windows, iOS, Android и т. Д.). Например, у вас может быть один общий проект для функции "Core", а затем отдельный проект с графическим интерфейсом для каждой из различных операционных систем, которые вы хотите поддерживать в своей программе.

Я понимаю, что это более старый вопрос, но так как он появился в Google, я решил ответить на него, поэтому, когда другие ищут то же самое, что они знают об этой очень мощной функции VS.

Один из вариантов дизайна - избегать доступа к app.config напрямую из ваших проектов библиотеки классов, что позволяет избежать дополнительной внешней зависимости.

Скорее, только ваш исполняемый проект знает о файле конфигурации, и он может явно передавать соответствующую информацию о конфигурации в библиотеки, когда он создает объекты из них или инициализирует их.

System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config = ConfigurationManager.OpenExeConfiguration(Path.Combine(@"D:\", "config.exe"));
foreach (string key in config.AppSettings.Settings.AllKeys)
{
   string value = config.AppSettings.Settings[key].Value;
   ConfigurationManager.AppSettings.Set(key, value);
}
Другие вопросы по тегам