8

chcę Odczyt/zapis (i zapisać) plik konfiguracyjny aplikacji w programieConfigurationProperty jest niedostępne ze względu na jego poziom ochrony

app.config jest tak:

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

Gdy używam ConfigurationManager.GetSection do zapoznania się z app.config, to działa:

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

B ut kiedy używam ConfigurationManager.OpenExeConfiguration:

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

zawsze ten błąd:

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

Ale wiem, GetSection nie można zapisać konfigurację przy starcie programu, jak mówiłem na początku : Chcę zapisać konfigurację w czasie uruchamiania programu, więc muszę użyć OpenExeConfiguration.

Mam google przez długi czas, co znalazłem jest użycie AppSettings, ale co używam to odcinek zwyczaj ..

Każdy może wyjaśnić, dlaczego ta „ConfigurationProperty jest niedostępna” błąd? Dzięki

Edit:

Mam ustawiony kopia lokalna z Systemu i System.Configuration do prawda

Odpowiedz

12

Można użyć this article.

Edit:

można użyć config:

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

ten kod:

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(); 

Również można użyć this article.

+0

Zdefiniowałem AdwordsSettings jako podklasę ConfigurationSection, tak jak powiedziałeś: http: //pastecode.com/jF i program zatrzymuje się tutaj: string path = AdwordsSettings.Settings.LogPath z NullReferenceException (Obiekt nie ustawiony na instancję obiektu) –

+0

A kiedy program się zatrzymuje, znalazłem AdwordsSettings.Ustawienia mają wartość ** null ** w debugerze –

+0

@ gbstack, powinieneś przeczytać ten artykuł bardziej szczegółowo lub przejść przez bardziej podobne artykuły, aby lepiej zrozumieć system konfiguracji, http://www.codeproject.com/KB/dotnet /mysteriesofconfiguration.aspx. Twój pierwotny błąd jest oczekiwany, ponieważ źle rozumiesz sposób czytania sekcji. –

1

Nie jestem pewien, czy to będzie działać za to, co próbujesz zrobić, ale czy próbowałeś za pomocą ConfigurationUserLevel.None zamiast?

+0

Dzięki, ale po użyciu ConfigurationUserLevel.None i ConfigurationUserLevel.PerUserRoaming, nadal otrzymuję ten sam błąd .. –

10

string klucz_value = refconfig.AppSettings.Settings ["nazwa_wystąpienia"] Wartość;

+0

to jest to, co i tak naprawiłem mój kod ... wywodzący się z tego "Configuration.AppSettings zwraca obiekt AppSettingSections, AppSettingSections wywodzi się z ConfigurationSection, który wywodzi się z ConfigurationElement, który definiuje ten operator [] jako" chroniony wewnętrzny ", co oznacza, że ​​jest" niedostępny z powodu poziomu ochrony ". Możesz chcieć wypróbować cs.AppSettings.Settings [" CompanyName "]);" – pcalkins

+0

miło - zadziałało dla mnie i uratowało mnie, że muszę zmienić moje ustawienia konfiguracji. dzięki. – soupy1976

Powiązane problemy