2017-02-17 4 views
1

Я прочитал this post from Marc Gravell, где показано, как читать app.config -файл из DLL. Когда я пытаюсь читать userSettings внутри этой библиотеки я получаю пустой список:Доступ к app.config из DLL

var settings = ConfigurationManager.OpenExeConfiguration("CodeGeneratorApp.exe").AppSettings.Settings; 

app.config -file выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="CodeGenerator.CodeGeneratorApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <userSettings> 
     <CodeGenerator.CodeGeneratorApp.Properties.Settings> 
      <setting name="CodeExtensions" serializeAs="Xml"> 
      <value> 
       <CodeExtensionList> 
       <Extension AssemblyQualifiedName="CodeGenerator.Extensions.NamespaceTypesExtension, CodeGenerator, Culture=neutral"> 
        <NamespaceTypesExtension /> 
       </Extension> 
       ... 
       </CodeExtensionList> 
      </value> 
      </setting> 
     </CodeGenerator.CodeGeneratorApp.Properties.Settings> 
    </userSettings> 
</configuration> 

Моя DLL и приложения расположены в той же папке и даже когда я добавить

var settings = ConfigurationManager.OpenExeConfiguration("CodeGeneratorApp.exe").AppSettings.Settings; 

к QuickWatch я вижу, что FilePath возвращенного объекта устанавливается в приложениях конфиг-фил e, поэтому он был найден и открыт должным образом.

В частности, я пытаюсь де-сериализовать value для CodeExtensionList, но я не знаю, как получить доступ к этому разделу внутри файла.

+0

это потому, что те 'userSettings' и вы просите' AppSettings'? –

+0

Я не думаю, что вы можете перейти к настройкам пользовательской области. Я думаю, вам нужно [это уродливое животное] (https://msdn.microsoft.com/en-us/library/ms134269 (v = vs.110) .aspx). Существует много неприятностей в отношении System.Configuration, «не делайте этого» - единственный хороший совет, о котором я могу думать. Проект EXE должен настроить библиотеку классов, которую он использует. –

ответ

1

Кажется, у вас есть вы просили. В вашем приложении app.config нет раздела appSettings. Вот почему AppSettings.Settings возвращает пустой список.

Редактировать

Кажется, вы пытаетесь загрузить пользовательский раздел CodeGenerator.CodeGeneratorApp.Properties.Settings. Если это так, то следующий код должен делать свою работу:

var settings = ConfigurationManager 
    .OpenExeConfiguration("CodeGeneratorApp.exe") 
    .GetSection("userSettings/CodeGenerator.CodeGeneratorApp.Properties.Settings") 
0

я, наконец, получил это работает с помощью klashar. Поскольку информация находится в пределах userSettings, нам необходимо запросить этот конкретный раздел, конечно. Это можно сделать с помощью следующего кода:

var config = ConfigurationManager.OpenExeConfiguration("CodeGeneratorApp.exe"); 
var sectionGroup = (ClientSettingsSection) config.GetSection("userSettings/CodeGenerator.CodeGeneratorApp.Properties.Settings"); 

Теперь мы можем получить SettingElement в этой группе, в моем случае there's только один, поэтому мы можем взять очень первых, запрос его содержание как Xml, пишут, что Xml к MemoryStream и де-сериализации, что поток:

var setting = (SettingElement) sectionGroup.Settings[0]; 

var ser = new XmlSerializer(typeof(CodeExtensionList)); 
MemoryStream stm = new MemoryStream(); 
StreamWriter stw = new StreamWriter(stm); 
stw.Write(setting.Value.ValueXml.InnerXml); 
stw.Flush(); 
stm.Position = 0; 
var value = ser.Deserialize(stm) as CodeExtensionList; 
Смежные вопросы