Добавление файла конфигурации приложения в проект C#
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Добавив файл конфигурации приложения (файл app.config) в проект C#, вы можете настроить способ, которым общеязыковая среда выполнения будет находить и загружать файлы сборки. Дополнительные сведения о файлах конфигурации приложения или сборках в .NET см. в статье о том, как среда выполнения находит сборки (платформа .NET Framework) и сборки в .NET.
Приложения UWP не содержат файл app.config.
При сборке проекта среда разработки автоматически копирует файл app.config, изменяет имя копии файла в соответствии с исполняемым файлом, а затем перемещает копию в каталог bin.
Добавление файла конфигурации приложения в проект C#
- В Обозреватель решений щелкните правой кнопкой мыши узел проекта и выберите пункт «Добавить >новый элемент». Откроется диалоговое окно Добавление нового элемента.
- Разверните установленные >элементы Visual C#.
- Выберите шаблон Файл конфигурации приложения в средней панели.
- Нажмите кнопку Добавить. В проект добавится файл с именем App.config.
Связанный контент
- Управление параметрами приложения (.NET)
- Схема файла конфигурации (.NET Framework)
- Настройка приложений .NET Framework
Cоздание файла App.Config c элементом connectionStrings
Cоздание файла App.Config c элементом connectionStrings
Продолжаем работать с приложением, созданным в предыдущей статье. Сегодня повысим гибкость, и переносимость нашего приложения, переместив строку подключения из кода программы в отдельный конфигурационный файл.
Создание и добавление файла App.Config
Чтобы создать конфигурационный файл необходимо выполнить несколько простых действий:
1. Перейдите в окно Solution Explorer
2. Нажмите правую кнопку мыши на имени текущего проекта
3. В появившемся контекстном меню выберите пункт Add, появиться дополнительное подменю, нажмите на пункт New Item.

4. Откроется диалоговое окно со списком шаблонов. Найдите шаблон с именем Application Configuration File, если требуется, измените, имя файла, после чего нажмите на кнопку Add.

В Solution Explorer появится добавленный файл App.Config.

Открываем добавленный файл, щелкнув по нему двойным кликом мыши в окне Solution Explorer.

Файл App.Config это обычный XML файл, внутри которого по умолчанию содержится строка декларации и один корневой элемент configuration. Сам же файл конфигурации, опять же по умолчанию, хранится в папке текущего проекта.

Если вы не знаете, что такое XML и как с ним работать, то прочитайте статью: Введение в язык XML, в которой вкратце изложены все основные моменты.
Создание и добавление элемента connectionStrings
Создадим новый элемент connectionStrings. Для этого сначала введите знак меньше ().

Внутри созданного элемента создадим ещё один элемент с именем add


Для данного элемента добавим несколько атрибутов. Чтобы добавить атрибут нажмите на клавишу пробел после слова add, появится меню авто подстановки.

Выберите атрибут name и нажмите на клавишу Enter

Внутри двойных кавычек укажите любое имя, например MysqlConStr.

Затем добавьте следующий атрибут connectionString

Внутри двойных кавычек нужно указать строку подключения, которая состоит из пары: ключ = значение.
Server указываем ip адрес или имя сервера, где лежит база данных MySQL. Предпочтительнее указывать ip адрес.
Database — имя базы данных;
Uid — пользователь;
Pwd — пароль;
Каждый пара отделяется точкой запятой, а для установки значения используется знак равно.
connectionString="Server=ip; DataBase=имяБД; Uid=логин; Pwd=пароль;"

Строка подключения может содержать множество других ключей, например:
Port по умолчанию MySQL сервер использует порт 3306 и его можно не указывать, но если же по какой-то причине номер порта был изменен, то его следует указать явно.
"Server=ip; DataBase=имяБД; Uid=логин; Pwd=пароль; Port=1034;"
SslMode если при работе с базой данных вы хотите использовать безопасное соединение с сервером, то укажите для данного параметра одно из следующих значений:
Preferred если сервер поддерживает SSL (криптографический протокол, который обеспечивает безопасность связи) то будет установлено безопасное соединение, если нет, то обычное.
Required все подключения будут только через протокол ssl. Если же на сервере нет поддержки ssl, то при обычном подключении вы получите отказ в подключении к серверу.
. ; SslMode=Preferred;"
Все остальные ключи и их описание можно найти на официальном сайте MySQL.
После добавления строки подключения, добавим ещё один атрибут providerName, который будет хранить имя поставщика данных.
providerName = "MySql.Data.MySqlClient"

полное содержимое файла App.Config
Таким же образом можно указать любое количество строк подключения и поставщиков данных к разным базам данных: MSSQL, Oracle, Access, например:
Ещё одним преимуществом файлов конфигурации, является быстрое изменение данных, которое не требует перекомпиляции проекта, ведь достаточно всего лишь внести изменения в файл XML, который является отдельным файлом.
Получение данных из файла конфигурации
Конфигурационный файл создан и теперь осталось научиться читать данные из файла App.Config.
Для начала нужно подключить в проект сборку (dll файл) System.Configuration;



2. Чтобы при написании кода обращаться к типам и членам, не используя полных имен, добавьте следующую строку:
using System.Configuration;
В предыдущей статье строка подключения была создана при помощи объекта типа MySqlConnectionStringBuilder (полный исходник здесь)
MySqlConnectionStringBuilder mysqlCSB; mysqlCSB = new MySqlConnectionStringBuilder(); mysqlCSB.Server = "127.0.0.1"; mysqlCSB.Database = "mytest"; mysqlCSB.UserID = "adminbd"; mysqlCSB.Password = "123";
Удалим весь блок кода, а так же строку
con.ConnectionString = mysqlCSB.ConnectionString;
Затем напишем следующий код:
ConnectionStringSettings conString; conString = ConfigurationManager.ConnectionStrings["MySQLConStr"];
В квадратных скобках указываем значение атрибута name элемента add. В результате в объекте conString мы получаем все значения элементов и атрибутов файла App.Config.
И последнее, что осталось сделать, это передать в объект MySqlConnection созданную строку подключения.
using (MySqlConnection con = new MySqlConnection(mysqlCSB.ConnectionString))
using (MySqlConnection con = new MySqlConnection(conString.ConnectionString))
Либо можно сразу же не создавая объект ConnectionStringSettings передать в конструктор класса MySqlConnection конструкцию следующего вида:
СonfigurationManager.ConnectionStrings["MySQLConStr"].ConnectionString;
- Загрузка csv файла с выводом данных в dataGridView
- Передача данных между формами в языке c#
- Пространства имён (namespace)
8 комментариев
Андрей :
А у меня в этой строке выкидывает какое то исключение. Я пока только обучаюсь и не особо могу понять, что к чему.
using (MySqlConnection con = new MySqlConnection(conString.ConnectionString))
Что то ругается именно на ConnectionString в кавычках.
Предупреждение типа NullReferenceException was unhandled
Мало информации… трудно сказать в чём именно проблема. conString.ConnectionString — это свойство, которое содержит значение connectionString в xml файле App.config
(connectionString="Server=127.0.0.1; Uid=adminBD; Pwd=123")
Если выдаёт null, то возможно допущена описка или неверно указано имя элемента в xml файле, либо что-то с его атрибутами.
Андрей :
Еще есть одна особенность. При создании файла конфига в окне создания пишу название файла например MyConnect.config а создается их 2. Первый с названием App.config. Я кстати который второй создался удалил сразу. Может быть в этом причина и зачем тогда студия создает второй?
Кстати компиляция и запуск приложения проходят нормально. Но при нажатии на кнопку, перебрасывает в студию и подсвечивает выше описанную строку с выделением на onnectionString.
Правильность написания уже несколько раз перепроверил, даже делал копипаст вашего кода. Сейчас с нуля еще раз попробую все пересоздать.
Андрей :
Ах да. Пользуюсь Visual Studio 2013 community
"Но при нажатии на кнопку, перебрасывает в студию и подсвечивает выше описанную строку с выделением на onnectionString."
Можете полное описание ошибки добавить? Вы создаёте один файл (MyConnect.config), второй (App.config) создаётся автоматически VS при создании нового проекта. Поэтому в VS 2012 и выше часть с добавлением конфиг. файла можно пропустить, так как он уже добавлен по умолчанию.
Ошибка возникает здесь:
ConnectionStringSettings conString; conString = ConfigurationManager.ConnectionStrings["MySQLConStr"];
conString равно null , потому что (по умолчанию) VS ищет файл App.Config, а Вы его удаляете и добавляете свой файл (MyConnect.config). Решение: так как используется VS2013, то создавать файл MyConnect.config не нужно, потому что App.Config уже добавлен студией, а нужно просто открыть данный файл (App.Config) и добавить в него строки подключения:
Андрей :
Спасибо огромное за решение. Просто тут же переименовал файл на имя App.config и все заработало. Интересно а как тогда добавлять файл со своим именем?
App.config и приложение на C#
У меня есть небольшая программа на 2 версии .NET, но новых версиях Windows она не запускается, но если создать файл настроек, то она запустится.
Есть какие-нибудь варианты, что можно сделать, чтоб было не 2 файла, а 1? Т.е внедрить этот файл настроек в exe или ещё как-нибудь.
Отслеживать
20.2k 6 6 золотых знаков 37 37 серебряных знаков 81 81 бронзовый знак
задан 5 мая 2018 в 16:15
135 5 5 бронзовых знаков
Судя по EnSO из кода это сделать нельзя. Ну а вообще, .net 2 , вы серьезно?! Зачем так издеваться над собой?
5 мая 2018 в 16:28
на старых компах может быть не установлен .NET 4, приходится использовать 2 версию
5 мая 2018 в 17:15
.NET 4 ставится на XP, куда ещё старее?
5 мая 2018 в 17:25
Напишите неуправляемое приложение на С++, которое будет из себя распаковывать программу на C# и конфиг во временную папку и запускать.
5 мая 2018 в 19:26
ПКМ по файлу *.exe => «Свойства» => «Совместимость» / «Запуск в режиме совместимости:» и хоть «Win95», например 🙂
7 мая 2018 в 6:47
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Встроить файл конфигурации в EXE-файл нельзя (так как весь смысл конфигурации — это возможность редактирования параметров без перекомпиляции программы, такой возможности не предусмотрели). Влиять на параметр supportedRuntime из кода на C# также нельзя, так этот параметр используется неуправляемым кодом загрузчика до того, как в процесс загружена CLR, и в этот момент управляемый код еще не может выполняться.
Если нужно управлять выбором версии CLR без файла конфигурации, единственный способ — написать свой собственный загрузчик на С++, пользуясь Unmanaged .NET API.
Например, создадим такую программу на C#:
using System; namespace ConsoleApplication1 < class Program < static int Run(string arg) < Console.WriteLine("Hello from .NET " + Environment.Version.ToString()); Console.ReadKey(); return 0; >static void Main(string[] args) < Run(""); >> >
Скомпилируем ее, получаем файл Program.exe. Создадим проект С++, добавим в него файл Program.exe и создадим файл ресурсов resource.rc следующего содержания:
#define IDR_RCDATA1 101 IDR_RCDATA1 RCDATA "Program.exe"
Напишем на С++ код загрузчика, который находит первую установленную версию CLR, загружает ее, извлекает из ресурсов программу на C# во временную папку и запускает ее:
#include #include #include #include #pragma comment(lib, "mscoree.lib") #define IDR_RCDATA1 101 int wmain(int argc, wchar_t* argv[]) < LPCWSTR prog_name = L"Program.exe"; //имя программы на C# //построим путь к временному файлу WCHAR temppath[300] = L"c:\\temp\\"; GetTempPath(300,temppath); wcscat(temppath,prog_name); //извлечем программу из ресурсов HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); UINT Size = ::SizeofResource(NULL, myResource); HGLOBAL myResourceData = ::LoadResource(NULL, myResource); void* pMyBinaryData = ::LockResource(myResourceData); FILE* f = _wfopen(temppath,L"wb"); fwrite(pMyBinaryData,Size,1,f); fclose(f); //инициализация CLR. HRESULT hr; ICLRMetaHost *pMetaHost = NULL; ICLRRuntimeInfo *pRuntimeInfo = NULL; ICLRRuntimeHost *pClrRuntimeHost = NULL; IEnumUnknown* pEnum= NULL; ICLRRuntimeInfo* pInfo= NULL; IUnknown* pUnk = NULL; hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost)); if(FAILED(hr))//поиск установленных версий CLR. pMetaHost->EnumerateInstalledRuntimes(&pEnum); if(FAILED(hr)) ULONG c= 0; WCHAR buffer[250]; DWORD cch = 250; while(1)< if(pInfo!=NULL)Release();pInfo = NULL;> if(pUnk!=NULL)Release();pUnk = NULL;> if(pRuntimeInfo!=NULL)Release();pRuntimeInfo = NULL;> hr = pEnum->Next(1,&pUnk,&c); if(hr != S_OK)break; pUnk->QueryInterface(IID_ICLRRuntimeInfo, (void**)&pInfo); if(FAILED(hr)) pInfo->GetVersionString(buffer,&cch); if(FAILED(hr)) hr = pMetaHost->GetRuntime(buffer, IID_PPV_ARGS(&pRuntimeInfo)); if(hr == S_OK) else > if(pRuntimeInfo == NULL) /* Можно также указать версию явно, например: pMetaHost->GetRuntime(L"v2.0.50727", IID_PPV_ARGS(&pRuntimeInfo)); pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo)); и т.п. */ hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pClrRuntimeHost)); if(FAILED(hr)) //запуск CLR hr = pClrRuntimeHost->Start(); if(FAILED(hr)) //Запуск программы на C# DWORD pReturnValue; hr = pClrRuntimeHost->ExecuteInDefaultAppDomain( temppath, L"ConsoleApplication1.Program", //класс L"Run", //метод L"", //параметр &pReturnValue); if(FAILED(hr)) End: //Освобождение ресурсов if(pMetaHost != NULL) pMetaHost->Release(); if(pRuntimeInfo != NULL) pRuntimeInfo->Release(); if(pClrRuntimeHost != NULL) pClrRuntimeHost->Release(); if(pEnum != NULL) pEnum->Release(); if(pInfo != NULL) pInfo->Release(); if(pUnk != NULL) pUnk->Release(); return 0; >
В результате программа, собранная под .NET 2.0, при его отсутствии будет запускаться на имеющейся версии .NET, как и при использовании параметра supportedRuntime .
Источники:
App.Config и Custom Configuration Sections
Данная статья может показаться банальной, но иногда что-то полезное забывается, а читать на импортном языке лень и книжки под рукой нет. Поэтому я, обратившись к гуглу, нашел хорошее описание процесса создания обработчика конфигурационной секции файла app.config в .net приложениях, перевел его, дополнил замечаниями (курсив) и комментариями и решил опубликовать.
Я уверен, что многим из вас приходилось использовать файл конфигурации App.Config для хранения инициализирующих или конфигурационных данных приложения. И я так же уверен в том, что многим из вас хотелось создать в данном файле свои собственные структуры для хранения настроек. Но в итоге приходилось использовать встроенные возможности секции и получать значения, используя конструкцию вида:
ConfigurationManager.AppSettings["MyKey"]
Что ж, я давно хотел выяснить, как использовать возможности класса ConfigurationSection для описания и загрузки данных, определенных в моем собственном формате. После нескольких часов экспериментов и гугления я смог создать свою структуру данных в файле конфигурации и воспользоваться ей в своем приложении.
- ConfigurationSection — Этот объект вернет нам пользовательскую секцию.
- ConfigurationElementCollection — Это собственно коллекция элементов, которые мы определим в пользовательской секции.
- ConfigurationElement — Это сам элемент, описывающий какую-от определенную вами сущность.
Первое, что нам потребуется сделать, это добавить в наше приложение файл app.Config (если, конечно, вы этого еще не сделали). После чего открываем данный файл и копипастим следующий код между тегами :
Замечание: данная секция должна располагаться в самом начале файла конфигурации, т.е. сразу после тега , иначе будут ошибки инициализации конфигурации.
Далее создадим нашу собственную секцию, которая будет реализовывать нашу собственную модель данных:
Замечание: если кому-то не нравиться добавление узлов командой add в данном примере, то всегда можно сделать свой собственный префикс, используя следующий код:
[ConfigurationCollection( typeof( FolderElement ) ), AddItemName = "Folder"] public class FoldersCollection : ConfigurationElementCollection
при определении коллекции элементов в структуре данных. Тогда в конфигурационном файле можно будет писать так:
Закончим модификации в файле конфигурации и перейдем к организации взаимодействия нашего приложения с ним.
Первым делом создадим класс-наследник от ConfigurationSection, что позволит нам взаимодействовать с нашей секцией в файле конфигурации через ConfigurationManager во время исполнения программы.
public class StartupFoldersConfigSection : ConfigurationSection < [ConfigurationProperty( "Folders" )] public FoldersCollection FolderItems < get < return ( (FoldersCollection)( base[ "Folders" ] ) ); >> >
Атрибут ConfigurationProperty( «Folders» ) требуется для сопоставления свойства FolderItems с корневым узлом нашей структуры данных.
Класс FoldersCollection является наследником ConfigurationElementCollection, который обеспечивает взаимодействие с коллекцией наших элементов, описанных в app.config. Определяется класс так:
[ConfigurationCollection( typeof( FolderElement ) )] public class FoldersCollection : ConfigurationElementCollection < protected override ConfigurationElement CreateNewElement() < return new FolderElement(); >protected override object GetElementKey( ConfigurationElement element ) < return ( (FolderElement)( element ) ).FolderType; >public FolderElement this[int idx ] < get> >
Последним нам нужно создать ConfigurationElement, класс который свяжет нас с конечными данными, определенными в конфигурационном файле.
public class FolderElement : ConfigurationElement < [ConfigurationProperty("folderType", DefaultValue="", IsKey=true, IsRequired=true)] public string FolderType < get set > [ConfigurationProperty( "path", DefaultValue = "", IsKey = false, IsRequired = false )] public string Path < getset > >
Атрибут ConfigurationProperty(«folderType») требуется для того, что бы проассоциировать имя xml-атрибута в файле конфигурации. Остальные параметры атрибута такие как DefaultValue="", IsKey=true, IsRequired=true определяют только различные опции применимые к свойствам.
Замечание: автор умалчивает, что при стандартном способе использования сеттер свойства FolderType, работать не будет, т.к. файл конфигурации обычно доступен только на чтение. Для того что бы представлялось возможным производить запись в файл конфигурации следует делать, например, так:
Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); StartupFoldersConfigSection section = (StartupFoldersConfigSection)cfg.Section["StartupFolders"]; if ( section != null ) < System.Diagnostics.Debug.WriteLine( section.FolderItems[0].FolderType ); System.Diagnostics.Debug.WriteLine( section.FolderItems[0].Path ); section.FolderItems[0].Path = "C:\\Nanook"; cfg.Save(); //устанавливает перенос на новую строку и производит проверку .vshost.exe.config файла в вашей отладочной папке. >
Итак, мы имеем все необходимые данные и классы, которые предоставляют нам возможность хранить в конфигурационном файле app.config пользовательскую структуру данных.
Использовать данный подход можно так:
StartupFoldersConfigSection section = (StartupFoldersConfigSection)ConfigurationManager.GetSection( "StartupFolders" ); if ( section != null )
При этом не забываем прописать System.Configuration в список подключаемых пространств имен.
- app.config
- конфигурация .net
- конфигурационная секция
- ConfigurationSection