2017-02-17 17 views
1

私はthis post from Marc Gravellを読んで、app.config -fileをDLLから読み取る方法を示しています。DLLから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; 

app.config -fileは、次のようになります。私はそのライブラリ内からuserSettingsを読み取ろうとすると、私は空のリストを取得しますそして私は、私が返されたオブジェクトのFilePathは、アプリケーションの設定-FILに設定されていることがわかりクイックウォッチに

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

を追加する場合でも、 e、それは正しく見つけられ、開かれました。

特に私が達成しようとしているのはvalueCodeExtensionListにデシリアライズすることですが、ファイル内のそのセクションにアクセスする方法もわかりません。

+0

です:MemoryStreamとそのストリームをデシリアライズするためのXML? –

+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としてその内容を照会、ということを書き取ることができますこれらは `あるuserSettings`、あなたは` AppSettings`を求めているので、それは

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;