2009-08-05 10 views
5

मैं इस तरह मेरी विधानसभा के विन्यास तक पहुँचने हूँ:विन्यास प्रबंधक के माध्यम से AppSettings के बाहर एक StringCollection हो रही

ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config"; 
Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
AppSettingsSection appSettings = conf.AppSettings; 

मेरे .config फ़ाइल इस

<configSections> 
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="CsDll.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </sectionGroup> 
</configSections> 
<connectionStrings> 
    <add name="CsDll.Properties.Settings.SabreCAD" connectionString="A Connection string." /> 
    <add name="CsDll.Properties.Settings.StpParts" connectionString="Another connection string" /> 
</connectionStrings> 
<applicationSettings> 
     <CsDll.Properties.Settings> 
      <setting name="StpInsertSearchPath" serializeAs="Xml"> 
       <value> 
        <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
         <string>A string</string> 
         <string>Another string in the collection</string> 

मैं सफलतापूर्वक पढ़ सकते हैं की तरह एक खंड शामिल हैं अगर मैं .config फ़ाइल संपादित करता हूं तो कनेक्शन सहित कनेक्शन स्ट्रिंग्स। तो, मुझे पता है कि मैं सही फाइल से जुड़ा हूं। लेकिन मुझे ऐप सेटिंग्स ऑब्जेक्ट के अंदर उस स्ट्रिंग संग्रह को नहीं मिला। यह में नहीं है। सेटिंग्स KeyValue कॉन्फ़िगरेशन चयन। मुझे अपना स्ट्रिंग संग्रह कहां मिल सकता है?

उत्तर

6

आपको संकलन में आइटम का उपयोग किया इस सरल सिंटैक्स का उपयोग करना चाहिए

foreach (string s in CsDll.Properties.Settings.Default.StpInsertSearchPath) 
{ 
    Console.WriteLine(s); 
} 

संपादित करें:

निम्नलिखित कोड चाल करना चाहिए

ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config"; 
Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
ConfigurationSectionGroup appSettingsGroup = conf.GetSectionGroup("applicationSettings"); 
ClientSettingsSection clientSettings = (ClientSettingsSection) appSettingsGroup.Sections["CsDll.Properties.Settings"]; 
ConfigurationElement element = clientSettings.Settings.Get("StpInsertSearchPath"); 
string xml = ((SettingElement)element).Value.ValueXml.InnerXml; 
XmlSerializer xs = new XmlSerializer(typeof(string[])); 
string[] strings = (string[])xs.Deserialize(new XmlTextReader(xml, XmlNodeType.Element, null)); 
foreach (string s in strings) 
{ 
    Console.WriteLine(s); 
} 

वहाँ एक छोटा तरीका हो सकता है , लेकिन यह मेरे लिए काम करता है।

+0

ठीक के लिए बाहर की जरूरत के साथ के रूप में ज्यादा पूरा होगा कोशिश कर रहे हैं। मैं उस तरह स्ट्रिंग सरणी पढ़ सकता हूं। लेकिन, तार असेंबली में संकलित डिफ़ॉल्ट से आ रहे हैं। असेंबली तैनात होने के बाद मुझे उस संग्रह में तार जोड़ने, हटाने और बदलने में सक्षम होना चाहिए। .Properties.Settings.Default .config फ़ाइल में संपादन नहीं लेता है। कनेक्शन स्ट्रिंग के साथ एक ही समस्या थी जब तक कि मैं कॉन्फ़िगरेशन प्रबंधक से गुजरना शुरू नहीं कर देता। –

+0

आपको शायद कॉन्फ़िगरेशन प्रबंधक की विधि तक पहुंचने की आवश्यकता है: कॉन्फ़िगरेशन प्रबंधक। गेटसेक्शन ("एप्लिकेशन सेटिंग्स"); जो ऑब्जेक्ट को वापस लेना चाहिए जिसके लिए आप – jkelley

+0

कॉन्फ़िगरेशन मैनेजर का विश्लेषण करना चाहते हैं। गेटसेक्शन ("एप्लिकेशन सेटिंग्स") शून्य –

1

आप कनेक्शन स्ट्रिंग आमतौर पर कॉन्फ़िगरेशन प्रबंधक की कनेक्शन स्ट्रिंग्स संपत्ति के अंदर हैं। आप अपनी स्थैतिक विधि के माध्यम से एक बहुत ही सरल फैशन में पहुंचने में सक्षम होना चाहिए।

string myConnectionString = ConfigurationManager.ConnectionStrings["connectioStringName"]; 

मेरा मानना ​​है कि आप AppSettings संपत्ति के माध्यम से उपयोग करने के लिए सक्षम करने के लिए ConfigurationManager .config फ़ाइल में टैग "AppSettings" के बदले "ApplicationSettings" का उपयोग करना चाहिए।

मुझे यह नहीं पता कि कॉन्फ़िगरेशन मैनेजर यह सुनिश्चित करने के लिए कैसे काम करता है कि यह आपकी समस्या का समाधान करेगा, लेकिन इसे नामित करना और उस कस्टम सेक्शन समूह को हटाने से ऐपसेटिंग ठीक से काम करने की अनुमति देनी चाहिए।

संपादित हाँ, ऐसा लगता है कि ConfigurationManager के AppSettings संपत्ति खंड .config फ़ाइल में नामित तक पहुँचता है।

2

ऐपसेटिंग और कनेक्शनस्ट्रिंग्स दोनों गुण सीधे कॉन्फ़िगरेशन प्रबंधक पर उपलब्ध हैं।

हालांकि, applicationSettings और userSettings, जो परिचित Settings.settings आप वी.एस. सेटिंग्स डिजाइनर में संपादित कर सकते हैं के अनुरूप है, पर प्राप्त करने के लिए इतना आसान नहीं है। ऐपसेटिंगएप्लिकेशन सेटिंग्स जो उपयोग में कॉन्फ़िगरेशन फ़ाइल के एक पूरी तरह से अलग अनुभाग में है।

आप applicationSettings और userSettings पर प्राप्त करने के लिए खनन दृष्टिकोण के ऊपर या एक संस्करण का उपयोग करना चाहिए। इसके अलावा, एप्लिकेशन सेटिंग्स केवल अगली बार जब आप एप्लिकेशन शुरू करेंगे, तो अपडेट हो जाएगा, अगर आप रनटाइम पर भी उन्हें लिखने में सक्षम हैं।तो फिर तुम

///<summary> 
    /// return the applicationSettings section 
    ///</summary> 
    ///<returns></returns> 
    public static ClientSettingsSection GetSettingsSection(ConfigurationSectionGroup group, string clientSectionName) 
    { 
     return (ClientSettingsSection)group.Sections[clientSectionName]; 
    } 


    ///<summary> 
    /// return the section settings collection 
    ///</summary> 
    ///<returns></returns> 
    public static System.Configuration.SettingElementCollection GetSettingsCollection(ClientSettingsSection section) 
    { 
     return section.Settings; 
    } 

    ///<summary> 
    /// return the connectionStrings section collection 
    ///</summary> 
    ///<returns></returns> 
    public static System.Configuration.SettingElementCollection ConnectionStringsCollection() 
    { 
     return ((ClientSettingsSection)SharedConfigSettings.GetSection("connectionStrings")).Settings; 
    } 

    ///<summary> 
    /// A collection of all the UserSettings in a SettingElementCollection 
    ///</summary> 
    ///<returns></returns> 
    public static SettingElementCollection UserSettings() 
    { 
     return 
      GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"userSettings"), 
                @"MyAssembly.Properties.Settings")); 
    } 

    ///<summary> 
    /// A collection of all the ApplicationSettings in a SettingElementCollection 
    ///</summary> 
    ///<returns></returns> 
    public static SettingElementCollection ApplicationSettings() 
    { 
     return 
      GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), 
                @"MyAssembly.Properties.Settings")); 
    } 

, दुर्भाग्य:

उदाहरण के लिए (कहीं और से cribbed -: - धन्यवाद)

public static string ReadSetting(string sectionGroupName, string sectionName, string settingName, Configuration config = null) 
    { 
     if (config == null) 
      config = SharedConfigSettings; 
     // Get sectionGroup 
     var sectionGroup = 
      config.GetSectionGroup(sectionGroupName); 

     // Get section 
     var section = 
      (ClientSettingsSection)sectionGroup.Sections.Get(sectionName); 
     // Get setting 
     var setting = section.Settings.Get(settingName); 
     // Read setting value 
     return setting.Value.ValueXml.InnerText; 
    } 

और एक अन्य उदाहरण के लिए (दुनिया के लिए धन्यवाद कई उदाहरण से adaoted) अभी भी SettingElement ऑब्जेक्ट्स से निपटना होगा जो इन अनुभागों में सेटिंग्स संग्रह में हैं। प्रत्येक को संपत्ति के लिए deserialized है जब तक यह एक स्ट्रिंग उदा। एक applicationSettings SettingElement (एक गतिशील रूप कार्यावधि में अद्यतन नहीं किया जा सकता है) के लिए:

(व्यायाम)

var y = GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), @"MyAssembly.Properties.Settings"); 
var c = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "WellKnownDirectories").Value).ValueXml 
       .InnerXml; // the setting as Xml 
var xs = new XmlSerializer(typeof(string[])); 
var strings = (string[])xs.Deserialize(new XmlTextReader(c, XmlNodeType.Element, null)); 

foreach (string s in strings) 
     { 
      Console.WriteLine(s); 
     } 

एक स्ट्रिंग संपत्ति यह आसान है के लिए (इस उदाहरण से ऊपर पहले एक साथ अनिवार्य रूप से अनावश्यक है):

var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml 
       .InnerText 

इन सभी उदाहरणों में एप्लिकेशन सेटिंग्स के साथ झुका हुआ है। वही दृष्टिकोण उपयोगकर्ता सेटिंग्स के साथ काम कर सकता है, संभवतः कुछ सहेजने के तरीकों के अतिरिक्त और साथ ही, और आपको ट्रैक (अधिक या कम) रखने की आवश्यकता है जिसमें से कई कॉन्फ़िगरेशन फ़ाइलें वास्तव में खेल में हैं - मुख्य, रोमिंग या स्थानीय ।

मैं ऐसा क्यों कर रहा हूं? चूंकि दो संबंधित अनुप्रयोग और एक सामान्य वर्ग लाइब्रेरी (या पुस्तकालय) सभी को उन अनुप्रयोगों में से एक के स्वामित्व वाली सेटिंग्स का उपयोग करने की आवश्यकता होती है जहां सेटिंग्स को दृष्टि से प्रबंधित किया जाता है। क्या किसी ने इसे बेहतर तरीके से हल किया है?

धन्यवाद।

2

अगर यह एक StringCollection आप सेटिंग्स

var strings = (StringCollection) Properties.Settings.Default["StpInsertSearchPath"]; 

से निकालने के लिए XmlSerializer

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