2012-06-22 15 views
34

यह मेरी app.configapp.config परिवर्तन मूल्य

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="lang" value="English"/> 
    </appSettings> 
</configuration> 
इस कोड के साथ

मैं परिवर्तन

lang = "Russian"; 
private void Main_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang); 
} 

बनाने लेकिन इसे बदल नहीं है। मैं क्या गलत कर रहा हूँ?

+0

यह भी देखें: http://stackoverflow.com/questions/5274829/configurationmanager-appsettings-how-to-modify-and- –

+0

को संभावित डुप्लिकेट [app.config फ़ाइल में मान लिखें] (http://stackoverflow.com/questions/4758598/write-values-in-app-config-file) – nawfal

उत्तर

41

आप इसके लिए AppSettings स्थिर ऑब्जेक्ट का उपयोग नहीं कर सकते हैं। इस

string appPath = System.IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location);   
string configFile = System.IO.Path.Combine(appPath, "App.config"); 
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();   
configFileMap.ExeConfigFilename = configFile;   
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); 

config.AppSettings.Settings["YourThing"].Value = "New Value"; 
config.Save(); 
+2

लेकिन यह पुनरारंभ होता है ... मैं परिवर्तन करता हूं प्रपत्र बंद होने पर ... जब मैं प्रोग्राम चलाता हूं तो कुछ भी नहीं बदलता – a1204773

+0

क्या आपको कोई अपवाद मिलता है? क्या आप WinForms का उपयोग कर रहे हैं? – fenix2222

+0

हां मैं WinForms का उपयोग कर रहा हूं ... कोई अपवाद नहीं ... – a1204773

82

AppSettings.Set आपकी कॉन्फ़िगरेशन फ़ाइल में परिवर्तनों को जारी नहीं रखता है। यह सिर्फ स्मृति में बदलता है। यदि आप System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang); पर ब्रेकपॉइंट डालते हैं, और System.Configuration.ConfigurationManager.AppSettings[0] के लिए एक घड़ी जोड़ें, तो आप कोड की उस पंक्ति को चलाते समय इसे "अंग्रेज़ी" से "रूसी" में बदल देंगे।

निम्नलिखित कोड (कंसोल एप्लिकेशन में उपयोग किया जाता है) परिवर्तन को जारी रखेगा।

class Program 
{ 
    static void Main(string[] args) 
    { 
     UpdateSetting("lang", "Russian"); 
    } 

    private static void UpdateSetting(string key, string value) 
    { 
     Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     configuration.AppSettings.Settings[key].Value = value; 
     configuration.Save(); 

     ConfigurationManager.RefreshSection("appSettings"); 
    } 
} 

इस पोस्ट से:http://vbcity.com/forums/t/152772.aspx

एक प्रमुख बिंदु से ऊपर के साथ ध्यान दें कि यदि आप इस डीबगर से (विजुअल स्टूडियो के अंदर) तो app.config फ़ाइल जाएगा द्वारा चलाए जा रहे है हर बार जब आप निर्माण करते हैं तो ओवरराइट किया जाए। इसका परीक्षण करने का सबसे अच्छा तरीका है अपने आवेदन को बनाना और फिर आउटपुट निर्देशिका पर नेविगेट करना और वहां से अपने निष्पादन योग्य को लॉन्च करना। आउटपुट निर्देशिका के भीतर आपको YourApplicationName.exe.config नाम की एक फ़ाइल भी मिल जाएगी जो आपकी कॉन्फ़िगरेशन फ़ाइल है। यह देखने के लिए नोटपैड में इसे खोलें कि वास्तव में परिवर्तन सहेजे गए हैं।

+0

मैं फिर परिवर्तन कैसे कर सकता हूं? – a1204773

+0

System.Configuration.ConfigurationManager.AppSettings [0] अकेले कुछ भी नहीं करेगा ... कृपया कोड – a1204773

+0

को वास्तव में @ लॉकलिप, 'ऐपसेटिंग [0]' संग्रह में पहला आइटम वापस करना चाहिए, इस मामले में आप ' लांग 'प्रविष्टि। –

2
private static string GetSetting(string key) 
    { 
     return ConfigurationManager.AppSettings[key]; 
    } 

    private static void SetSetting(string key, string value) 
    { 
     Configuration configuration = 
      ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     configuration.AppSettings.Settings[key].Value = value; 
     configuration.Save(ConfigurationSaveMode.Full, true); 
     ConfigurationManager.RefreshSection("appSettings"); 
    } 
+1

आप कॉन्फ़िगरेशनसेवमोड.फुल में कॉन्फ़िगर को सहेजना नहीं चाहते हैं। यह आपके ऐप.कॉन्फिग को सामान का एक टन विज्ञापन देगा जो आप नहीं चाहते हैं। बाकी अच्छा है। – Jeremy

+0

आप 'ओपनएक्स कॉन्फ़िगरेशन' को कॉल करने के लिए 'Application.ExecutablePath' विकल्प के साथ गठबंधन करना भी चाह सकते हैं, जैसा कि @ अमीन Ghaderi के उत्तर – mcw0933

10

जब उपयोग "ConfigurationUserLevel.None" अपने कोड सही रन जब आप डिबग फ़ोल्डर में nameyourapp.exe में क्लिक करें। ।
लेकिन जब विज़ुअल स्टडीओ पर आपका विकासशील ऐप सही नहीं चलता है !! क्योंकि "vshost.exe" चलाया जाता है।

निम्नलिखित पैरामीटर इस समस्या का समाधान: "Application.ExecutablePath"

इस प्रयास करें: (वी.एस. 2012 में परीक्षण किया गया डेस्कटॉप के लिए एक्सप्रेस)

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["PortName"].Value = "com3"; 
config.Save(ConfigurationSaveMode.Minimal); 

मेरी अंग्रेजी अच्छी नहीं , मुझे क्षमा करें।

1

.NET 4.0 कंसोल एप्लिकेशन के लिए, इनमें से कोई भी मेरे लिए काम नहीं करता है। तो मैं नीचे के रूप में केवन Aenmey के जवाब में संशोधन किया और यह काम किया:

private static void UpdateSetting(string key, string value) 
{ 
    Configuration configuration = ConfigurationManager. 
     OpenExeConfiguration(Assembly.GetExecutingAssembly().Location); 
    configuration.AppSettings.Settings[key].Value = value; 
    configuration.Save(); 

    ConfigurationManager.RefreshSection("appSettings"); 
} 

केवल पहली पंक्ति अलग है, वास्तविक क्रियान्वित विधानसभा पर निर्माण किया।

2

fenix2222 द्वारा जवाब (जो मेरे लिए काम किया) के अलावा मैं करने के लिए अंतिम पंक्ति को संशोधित करने के लिए किया था:

config.Save(ConfigurationSaveMode.Modified); 

इस के बिना, नया मान अभी भी कॉन्फ़िग फ़ाइल लेकिन पुराने करने के लिए लिखा जा रहा था डिबगिंग के दौरान मूल्य पुनर्प्राप्त किया गया था।

5

वह मेरे लिए काम किया WPF आवेदन में: उत्तर के लिए

string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe"); 
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath); 
config.AppSettings.Settings["currentLanguage"].Value = "En"; 
config.Save(); 
+2

में उल्लिखित है, आपका कोड भी मेरे लिए काम करता है। धन्यवाद! – jned29

+1

@ jned29 मेरे उत्तर को ऊपर उठाने के लिए स्वतंत्र महसूस करें, अगर यह आपको मदद करता है :)। – StepUp

0

धन्यवाद Jahmic। मेरे लिए ठीक से काम किया।

एक और उपयोगी कोड स्निपेट है कि मूल्यों पढ़ सकते हैं और एक स्ट्रिंग लौटाने:

public static string ReadSetting(string key) 
    { 
     System.Configuration.Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     System.Configuration.AppSettingsSection appSettings = (System.Configuration.AppSettingsSection)cfg.GetSection("appSettings"); 
     return appSettings.Settings[key].Value; 

    }