#c# #.net #app-config
#c# #.net #app-config
Вопрос:
Я поиграл с тем, как использовать Configuration Manager для чтения / записи пользовательских разделов в файле App.config для приложения WPF на C #. Я прочитал эту превосходную статью о демистифицированной конфигурации .NET 2.0, и это очень помогло мне в использовании конфигурационных файлов. Вот исходный файл App.config, который я написал, и он отлично работает.
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="example" type="CustomConfig.ExampleSection, CustomConfig" />
</configSections>
<example version="A sample string value." />
<appSettings>
<add key="version_string" value="1.01" />
</appSettings>
</configuration>
Но когда я изменил файл App.config таким образом, что мой пользовательский раздел будет считываться из внешнего файла конфигурации, упомянутого в configSource, Visual Studio выдает мне ошибку
Формат файла configSource должен быть элементом, содержащим название раздела.
Вот файлы App.config и example.config
Изменен App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="example" type="CustomConfig.ExampleSection, CustomConfig" />
</configSections>
<example configSource="example.config" />
<appSettings>
<add key="version_string" value="1.01" />
</appSettings>
</configuration>
example.config
<?xml version="1.0"?>
<example>
<add key="version" value="blahblah" />
</example>
Комментарии:
1. Если вы публикуете образцы кода, XML или данных, пожалуйста , выделите эти строки в текстовом редакторе и нажмите на кнопку «образцы кода» (
{ }
) на панели инструментов редактора, чтобы красиво оформить и выделить синтаксис! При публикации сообщений об ошибках, пожалуйста , используйте кавычки ( ` » ` ) для правильного форматирования сообщения об ошибке.2. Спасибо, я буду иметь это в виду в следующий раз
3. Кажется, что вы поместили свой
configSource=
в<example>
тег, но на самом деле вы внедрили содержимое своего<appSettings>
тега…….
Ответ №1:
Я получил ту же ошибку. В моем случае это связано с тем, что у меня есть ключи в двух файлах, а затем обнаруживаю appSettings
тег как дублированный.
если вам нужно сохранить некоторые ключи, связанные с проектом, в web.config и ваш персональный ключ в другом файле (рекомендуется по соображениям безопасности), используйте file
свойство вместо configSource
.
файл web.config:
<configuration>
<appSettings file="../AppSettings.config">
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
</appSettings>
</configuration>
Файл AppSettings.config:
<?xml version="1.0"?>
<appSettings>
<add key="RutaBodega" value="D:TestCard"/>
<add key="CodeLen" value="5"/>
</appSettings>
Надеюсь, это поможет другим!
Ответ №2:
У редактора Visual Studio / intellisense есть недостаток в том, что он жалуется на configSource=
атрибут — но это абсолютно законно, и это действительно работает; Я использую его каждый день в различных производственных системах.
Моя рекомендация: просто попробуйте! 🙂 Запустите код — я почти уверен, что он сработает (ваши конфигурации выглядят нормально для меня).
Обновление: хорошо — похоже, вы полностью меняете стиль <example>
тега. В вашем оригинале app.config
у вас есть:
<example version="A sample string value." />
Поэтому, конечно, ваш externalized example.config
должен содержать те же значения и ту же структуру:
<?xml version="1.0"?>
<example version="A sample string value." />
Можете ли вы попробовать с этим example.config
??
Комментарии:
1. marc Я действительно запустил код, и он выдавал мне это исключение. Вот изображение ошибки imageshack.us/photo/my-images/840/errorgz.jpg . На самом деле я провел множество поисковых запросов в Интернете и обнаружил, что я все делал правильно, но он просто не запускался
2. @chaitanya: когда вы помещаете свой узел <example> во внешний конфигурационный файл, вы не можете полностью изменить свою структуру!! Вам нужно иметь точно такую же структуру, которая была у вас раньше в вашем первом app.config — смотрите Мое обновление….
3. Отлично. Спасибо, Марк, это работает. Что было не так со структурой ключей и значений. Соответствует ли тег add всякий раз, когда у вас есть тег, вложенный внутри тега example
4. Вы используете
<add key="..." value="..." />
, когда раздел конфигурации, с которым вы имеете дело, имеет такую структуру — например,<appSettings>
. Это не имеет ничего общего с помещением вашей конфигурации во внешний файл..
Ответ №3:
Моя проблема в том, что я добавлял configSource И ключ в один и тот же тег.
Неверный:
<appSettings configSource="Appsettings.config">
<add key="Setting1" value="May 5, 2014"/>
</appSettings>
Если вы удалите тег «добавить» или переместите его в свой файл configSource, ошибка исчезнет.
Исправить:
<appSettings configSource="Appsettings.config" />
Ответ №4:
Если раздел, который вы делаете внешним, определен в configSections, вам следует поместить атрибут configSource в элемент, определяющий раздел. Только разделы AppSettings и ConnectionStrings (которым не нужны определения в configSections) должны иметь теги с configSource в теле основного конфигурационного файла.
Комментарии:
1. Кит, у меня просто есть теги для AppSettings, если вы посмотрите в измененный файл App.config, и я думаю, что я поместил атрибут configSource в элемент «example»
2. Неверно — любой раздел конфигурации может быть экстернализирован с помощью
configSource=
атрибута — даже если VS жалуется на это….3. Частично помогло. Поскольку только внешний пользовательский раздел выдает ошибку. Мне пришлось определить с
<section name="CustomConfigSection" type="Teknikprogramlama.Configuration.Manager.Examples.Sections.CustomConfigSection, Teknikprogramlama.Configuration.Manager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />