我已阅读this post from Marc Gravell,了解如何从DLL中读取app.config
- 文件。当我尝试从该库中读取userSettings
时,我得到一个空列表:
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;
到QuickWatch我看到返回对象的FilePath
被设置为应用程序配置文件,因此找到并正确打开它。
特别是我想要实现的是对value
的{{1}}反序列化,但我不知道如何在文件中访问该部分。
答案 0 :(得分:1)
好像你已经要求了。
app.config中没有appSettings部分。这就是AppSettings.Settings
返回空列表的原因。
修改的
您似乎正在尝试加载自定义部分CodeGenerator.CodeGeneratorApp.Properties.Settings
。如果是这种情况,以下代码应该完成工作:
var settings = ConfigurationManager
.OpenExeConfiguration("CodeGeneratorApp.exe")
.GetSection("userSettings/CodeGenerator.CodeGeneratorApp.Properties.Settings")
答案 1 :(得分:0)
我终于在klashar的帮助下得到了它。由于信息位于userSettings
内,我们需要查询此特定部分。这可以通过以下代码完成:
var config = ConfigurationManager.OpenExeConfiguration("CodeGeneratorApp.exe");
var sectionGroup = (ClientSettingsSection) config.GetSection("userSettings/CodeGenerator.CodeGeneratorApp.Properties.Settings");
现在我们可以获得该组中的SettingElement
,在我的情况下只有一个,所以我们可以采取第一个,查询其内容为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;