2017-02-17 78 views
1

我已阅读this post from Marc Gravell显示如何从DLL读取app.config-文件。当我试图从库中读取userSettings我得到一个空列表:从DLL中访问app.config

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

app.config - 文件看起来是这样的:

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

的快速监视我看到返回的对象的FilePath设置为应用程序配置-FIL e,因此被发现并正确打开。

特别是什么我正尝试实现的是反序列化valueCodeExtensionList,但我不知道如何甚至访问文件内的部分。

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