Подтвердить что ты не робот

Single app.config multi-project С#

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

Как получить доступ к конфигурациям?

ConfigurationManager.AppSettings["config1"]
4b9b3361

Ответ 1

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

<?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;

Ответ 2

Скажем, у вас есть эта структура папок:

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

Сделайте это:

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

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

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

Отредактировано для добавления:

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

Ответ 3

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

Add existing item dialog

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

Марк

Ответ 4

Я нашел кнопку и открыл 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 и таинственные конфигурации см. в трехчастной серии Jon Rista по конфигурации .NET 2.0 на CodeProject.

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

Марк

Ответ 5

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

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

Ответ 6

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

VS2015 С# Shared Project

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

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

Visual Studio 2015 - общий учебник по проекту:

Создайте новый общий проект, выбрав "Файл" - "Создать" - "Проект" или "Щелкните правой кнопкой мыши по решению" в обозревателе решений и выберите "Добавить → Новый проект". Когда появится диалоговое окно, выберите "Общий проект", дайте проекту имя TestShared в этом примере.

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

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

app.config

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

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

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

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

Ответ 7

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);
}