16

I wanna read/write (and save) application's configuration file in program

The app.config is like this:

<configuration>
  <configSections>
    <section name="AdWordsApi" type="System.Configuration.DictionarySectionHandler" requirePermission="false"/>
  </configSections>
  <AdWordsApi>
    <add key="LogPath" value=".\Logs\"/>
    ...
  </AdWordsApi>
</configuration>

When I use ConfigurationManager.GetSection to read the app.config, it works:

var adwords_section = (System.Collections.Hashtable) System.Configuration.ConfigurationManager.GetSection("AdWordsApi");
Console.WriteLine((string)adwords_section["LogPath"]);

But when I use ConfigurationManager.OpenExeConfiguration:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
ConfigurationSection section = config.GetSection("AdWordsApi");
Console.WriteLine(section["LogPath"]);

I always get this error:

'System.Configuration.ConfigurationElement.this[System.Configuration.ConfigurationProperty]' is inaccessible due to its protection level

But as I know, GetSection cannot save configuration at program runtime, Like I said at beginning: I wanna save configuration at program runtime, So I have to use OpenExeConfiguration.

I have googled for long time, what I found is to use AppSettings, but what I use is custom section..

Anyone could explain why this "ConfigurationProperty is inaccessible" error occured? Thanks

Edit:

I have set copy local of System and System.Configuration to true

Mark Ma
  • 1,342
  • 3
  • 19
  • 35

3 Answers3

22
string key_value = refconfig.AppSettings.Settings["key_name"].Value;
SᴇM
  • 7,024
  • 3
  • 24
  • 41
pcalkins
  • 1,188
  • 13
  • 20
  • 1
    that's what fixed my code anyway... derived from this "Configuration.AppSettings returns an AppSettingSections object, AppSettingSections is derived from ConfigurationSection which is derived from ConfigurationElement which defines a this[] operator as "protected internal", which mean that it is "inaccessible due to its protection level." You might want to try cs.AppSettings.Settings["CompanyName"]);" – pcalkins Apr 03 '15 at 00:08
  • 1
    nice - worked for me, and saved me having to refactor my config settings. thanks. – soupy1976 Dec 21 '15 at 09:55
15

You can use this article.

Edit:

you can use config:

  <configSections>
    <section name="AdWordsApi.appSettings" type="System.Configuration.AppSettingsSection" />
  </configSections>
  <AdWordsApi.appSettings>
    <add key="LogPath" value=".\Logs\"/>
  </AdWordsApi.appSettings>

this code:

    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    var settings = config.GetSection("AdWordsApi.appSettings") as AppSettingsSection;
    if (settings != null) Console.Write(settings.Settings["LogPath"].Value);
    Console.ReadLine();

Also You can use this article.

Sinan AKYAZICI
  • 3,942
  • 5
  • 35
  • 60
  • I defined the AdwordsSettings as a subclass of ConfigurationSection as you said:http://pastecode.com/jF, and program stops here: string path = AdwordsSettings.Settings.LogPath with an NullReferenceException(Object not set to an instance of an object) – Mark Ma Dec 22 '11 at 06:54
  • And when program stops there, I found AdwordsSettings.Settings is **null** in debugger – Mark Ma Dec 22 '11 at 07:02
  • @gbstack, you should read that article in more details, or go through more similar articles to get better understanding of the configuration system, http://www.codeproject.com/KB/dotnet/mysteriesofconfiguration.aspx. Your original error is expected, as you misunderstand how to read the section. – Lex Li Dec 22 '11 at 09:49
  • @LexLi, Thanks, I'll read it. Exactly I know little about Configuration system – Mark Ma Dec 22 '11 at 12:19
1

I'm not sure if it will work for what you are trying to do, but have you tried using ConfigurationUserLevel.None instead?

MEverett
  • 111
  • 7
  • Thanks, but after using ConfigurationUserLevel.None and ConfigurationUserLevel.PerUserRoaming, I still get the same error.. – Mark Ma Dec 21 '11 at 10:12