Недавно я начал создавать консольную версию веб-приложения. Я скопировал свои настраиваемые разделы из файла web.config. в мой app.config. Когда я иду за информацией о конфигурации, я получаю эту ошибку:
Произошла ошибка при создании обработчика раздела конфигурации для x / y: не удалось загрузить тип x из сборки System.Configuration
Строка, которая ему не нравится:
вернуть ConfigurationManager.GetSection ("X / Y") как Z;
Кто-нибудь сталкивался с чем-то подобным?
Я смог добавить
<add key = "IsReadable" value = "0"/>
в appSettings и прочтите.
Добавление:
Я действительно определил это в настраиваемом разделе:
<configSections>
<sectionGroup name = "x">
<section name = "y" type = "zzzzz"/>
</sectionGroup>
</configSections>





похоже, что ваш обработчик раздела конфигурации не определен
<configSection>
<section
name = "YOUR_CLASS_NAME_HERE"
type = "YOUR.NAMESPACE.CLASSNAME, YOUR.NAMESPACE, Version=1.1.0.0, Culture=neutral, PublicKeyToken=PUBLIC_TOKEN_ID_FROM_ASSEMBLY"
allowLocation = "true"
allowDefinition = "Everywhere"
/>
</configSection>
Для решения вашей проблемы не требуются Culture и PublicKey. Посмотрите мою короткую версию ниже.
@Daok: Я просто выполнял приказы! ;-)
Если вам нужен пользовательский обработчик конфигурации, вы должны определить класс и ссылаться на него, как показано Стивеном Лоу. Вы можете наследовать от предопределенных обработчиков, или вы можете просто использовать пару значение / ключ, которая предлагается в разделе appSetting, как вы отметили.
В верхней части файла вам необходимо иметь тег configSection внутри раздела.
У вас тоже может быть sectionGroup. Пример:
<configuration>
<configSections>
<sectionGroup name = "x">
<section name = "y" type = "a, b"/>
</sectionGroup>
<configSections>
</configuration>
Этот класс работает как общий обработчик настраиваемого раздела конфигурации для любого типа ...
public class XmlConfigurator : IConfigurationSectionHandler
{
public object Create(object parent, object configContext, XmlNode section)
{
if (section == null) return null;
Type sectionType = Type.GetType((string)(section.CreateNavigator()).Evaluate("string(@configType)"));
XmlSerializer xs = new XmlSerializer(sectionType);
return xs.Deserialize(new XmlNodeReader(section));
}
}
В вашем app.config добавьте
<section name = "NameofConfigSection" type = "NameSpace.XmlConfigurator, NameSpace.Assembly"/>
И в элементе раздела конфигурации добавьте атрибут, чтобы указать тип, в который вы хотите десериализовать корневой элемент.
<?xml version = "1.0" encoding = "utf-8" ?>
<NameofConfigSection configType = "NameSpace.NameofTypeToDeserializeInto, Namespace.Assembly" >
...
</NameofConfigSection>
IConfigurationSectionHandler устарел в .NET 2.0 и более поздних версиях. Вместо этого наследуйте от ConfigurationSection.
Но, насколько я понимаю, вы не можете дублировать функциональность, которую предоставляет приведенный выше код (то есть возможность десериализовать ЛЮБОЙ раздел конфигурации с одним и тем же «универсальным» обработчиком), используя более новую методологию ... Используя ConfigurationSection, вам нужно написать новый производный класс для каждого нового раздела конфигурации, который вы хотите десериализовать ...
Недавно у меня была такая же проблема. Я создал настраиваемую группу разделов для веб-приложения (работала нормально), но когда я перенес этот слой в консольное приложение, группа разделов не работала.
Вы правильно ответили на свой вопрос относительно того, какая часть «типа» требуется в вашем определении раздела. Я изменил ваш раздел конфигурации следующим примером:
<configSection>
<section
name = "yourClassName"
type = "your.namespace.className, your.assembly"
allowLocation = "true"
allowDefinition = "Everywhere" />
</configSection>
Вы заметите, что у типа теперь есть имя класса, за которым следует имя сборки. Это необходимо для взаимодействия вне веб-среды.
ПРИМЕЧАНИЕ. Имя сборки не обязательно совпадает с вашим пространством имен (для данного раздела).
Какая часть этого типа раздела требуется?