11

मैं कॉन्फ़िगरेशन मैनेजर का उपयोग कर कॉन्फ़िगरेशन फ़ाइल में उपयोगकर्ता सेटिंग्स को जारी रखने की कोशिश कर रहा हूं।उपयोगकर्ता को कैसे लिखें। कॉन्फ़िगरेशन प्रबंधक के माध्यम से फ़ाइल कॉन्फ़िगर करें?

मैं इन सेटिंग्स को केवल उपयोगकर्ता को स्कॉप करना चाहता हूं, क्योंकि एप्लिकेशन परिवर्तनों को व्यवस्थापक विशेषाधिकारों के बिना Vista/Win 7 पर सहेजा नहीं जा सकता है।

ऐसा लगता है कि मुझे उपयोगकर्ता की कॉन्फ़िगरेशन मिलती है, जो कि विन 7 ([ड्राइव]: \ उपयोगकर्ता \ [उपयोगकर्ता नाम] \ AppData \ Local \ [ApplicationName] \ [Assembly नाम] [हैश] \ "में यहां सहेजा गया प्रतीत होता है। [ संस्करण \)

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 

जब भी मैं इस config मैं इस अपवाद प्राप्त करने के लिए सभी पर किसी भी परिवर्तन को बचाने की कोशिश:

InnerException: System.InvalidOperationException 
Message="ConfigurationSection properties cannot be edited when locked." 
Source="System.Configuration" 
StackTrace: 
    at System.Configuration.SectionInformation.VerifyIsEditable() 
    at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates& definitionUpdates, ArrayList& configSourceUpdates) 

मैं इस config के लिए एक कस्टम ConfigurationSection जोड़ने की कोशिश की है। मैंने AppSettingsSection में जोड़ने का प्रयास किया है। जब भी मैं config.Save() पर कॉल करता हूं तो यह ऊपर अपवाद फेंकता है।

कोई विचार?

मैंने प्रोजेक्ट-> सेटिंग डिज़ाइनर के माध्यम से एप्लिकेशन सेटिंग्सबेसबेस क्लास का उपयोग करने का प्रयास किया, लेकिन ऐसा नहीं लगता है कि आप इसके साथ कस्टम प्रकारों को सहेज सकते हैं। मैं कस्टम प्रकारों को बचाने की क्षमता के साथ समान कार्यक्षमता चाहता हूं।

+0

बाहर निकलता है आप परियोजना-> सेटिंग्स डिजाइनर के साथ प्रकार के लिए कस्टम का उपयोग कर सकते हैं। वे उन्हें प्रकार के संवाद में सूचीबद्ध नहीं करते हैं, लेकिन यदि आप सही नाम/नामस्थान में टाइप करते हैं तो आप किसी भी प्रकार का उपयोग कर सकते हैं। प्रकार XmlSerializable या टाइपकॉन्टर के साथ स्ट्रिंग से कनवर्ट करने योग्य होना चाहिए। –

उत्तर

8

आप अनुभाग के लिए SectionInformation.AllowExeDefinition मूल्य निर्धारित करने की आवश्यकता:

Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming); 
UserSettings settings; 
if ((settings = (UserSettings)configuration.Sections[GENERAL_USER_SETTINGS]) == null) 
{ 
     settings = new UserSettings(); 
     settings.SectionInformation.AllowExeDefinition = 
       ConfigurationAllowExeDefinition.MachineToLocalUser; 
     configuration.Sections.Add(GENERAL_USER_SETTINGS, settings); 
     configuration.Save(); 
} 

डिफ़ॉल्ट मान ConfigurationAllowExeDefinition.MachineToApplication जो केवल machine.config और app.exe.config पर खंड करने की अनुमति देता है।

+0

मैं कोशिश करूँगा। मैंने एक बार AllowExeDefinition प्रॉपर्टी को सेट करने का प्रयास किया और उसी अपवाद का कारण बना दिया जो config.Save() निकाल दिया गया। मैं इस कोड सेगमेंट की प्रतिलिपि बनाउंगा और पुनः प्रयास करूंगा। –

+0

ऐसा प्रतीत होता है कि मुझे अनुभाग जोड़ने और पहली बार परिवर्तनों को सहेजने से पहले AllowExeDefinition सेट करने की आवश्यकता है। अब सब कुछ ठीक काम कर रहा प्रतीत होता है। –

+2

किसी कारण से, _ConfigurationManager.OpenExeConfiguration_ का उपयोग करके _ConfigurationUserLevel_ अधिभार के साथ, मुझे यह दावा करके फ़ाइल को संपादित और सहेजने की अनुमति नहीं दी गई है कि _ConfigurationSection गुणों को लॉक किए जाने पर संपादित नहीं किया जा सकता है। केवल जब मैंने _string exepath_ अधिभार का उपयोग किया है, तो मैं कॉन्फ़िगरेशन को सहेजने में सक्षम था। – itsho

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^