2010-03-05 16 views
9

reading settings from a separate config file से संबंधित प्रश्न हैं और अन्य इसके समान हैं, लेकिन मेरा प्रश्न एप्लिकेशन प्रॉपर्टी सेटिंग्स (यानी <MyApplication.Properties.Settings> - नीचे एक्सएमएल फ़ाइल देखें) और उन्हें गतिशील रूप से लोड करने के लिए विशिष्ट है। मैं this post में विधि है, जो मुख्य कॉन्फ़िग फ़ाइल के पूरे appSettings अनुभाग ताज़ा शामिल करने की कोशिश की, लेकिन मेरे अनुकूलन अपवाद फेंक दिया क्योंकि मैं appSettings अनुभाग की जगह नहीं कर रहा था:डायनामिक रूप से एक अलग एप्लिकेशन सेटिंग्स फ़ाइल को लोड करने और वर्तमान सेटिंग्स के साथ विलय कैसे करें?

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
// Have tried the other ConfigurationUserLevels to no avail 
config.AppSettings.File = myRuntimeConfigFilePath; 
config.Save(ConfigurationSaveMode.Modified); // throws ConfigurationErrorsException 
ConfigurationManager.RefreshSection("userSettings"); 

ConfigurationErrorsException.Message है "रूट तत्व फ़ाइल को संदर्भित करने वाले अनुभाग के नाम से मेल खाना चाहिए, 'ऐपसेटिंग' (सी: \ myFile.xml लाइन 2)। " फ़ाइल है:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <userSettings> 
     <MyApplication.Properties.Settings> 
      <setting name="SineWaveFrequency" serializeAs="String"> 
       <value>6</value> 
      </setting> 
      <setting name="SineWaveAmplitude" serializeAs="String"> 
       <value>6</value> 
      </setting> 
     </MyApplication.Properties.Settings> 
    </userSettings> 
</configuration> 

वहाँ MyApplication.Properties.Settings.Default वर्ग में इस फ़ाइल से मूल्यों को आयात करने का एक रास्ता है, ढांचे के सभी XML अक्रमांकन से निपटने जब कॉन्फ़िग फ़ाइल आवेदन स्टार्टअप पर लोड किया जाता है जैसे कि यह करता है के साथ?

+0

यदि आप प्रेरणा के बारे में उत्सुक हैं, तो मेरा पहला प्रश्न देखें: [सभी अनुप्रयोग डेटा को सहेजने और पुनर्स्थापित करने के लिए .NET कॉन्फ़िगरेशन फ़ाइलों (app.config, settings.settings) का उपयोग कैसे करें?] (Http: // stackoverflow। com/प्रश्न/1869628/कैसे के लिए उपयोग निवल विन्यास-फ़ाइलें-ऐप-config-सेटिंग-सेटिंग-टू-बचाने और आर)। उस समय, मुझे app.config और user.config के बीच का अंतर नहीं पता था, लेकिन मैं निश्चित रूप से user.config को संशोधित करने के लिए एक समाधान की तलाश में हूं। – Pat

उत्तर

7

खैर, यह काम करता है:

using System; 
using System.Configuration; 
using System.IO; 
using System.Linq; 
using System.Xml.Linq; 
using System.Xml.XPath; 

public static class SettingsIO 
{ 
    internal static void Import(string settingsFilePath) 
    { 
     if (!File.Exists(settingsFilePath)) 
     { 
      throw new FileNotFoundException(); 
     } 

     var appSettings = Properties.Settings.Default; 
     try 
     { 
      var config = 
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal); 

      string appSettingsXmlName = 
Properties.Settings.Default.Context["GroupName"].ToString(); 
// returns "MyApplication.Properties.Settings"; 

      // Open settings file as XML 
      var import = XDocument.Load(settingsFilePath); 
      // Get the whole XML inside the settings node 
      var settings = import.XPathSelectElements("//" + appSettingsXmlName); 

      config.GetSectionGroup("userSettings") 
       .Sections[appSettingsXmlName] 
       .SectionInformation 
       .SetRawXml(settings.Single().ToString()); 
      config.Save(ConfigurationSaveMode.Modified); 
      ConfigurationManager.RefreshSection("userSettings"); 

      appSettings.Reload(); 
     } 
     catch (Exception) // Should make this more specific 
     { 
      // Could not import settings. 
      appSettings.Reload(); // from last set saved, not defaults 
     } 
    } 

    internal static void Export(string settingsFilePath) 
    { 
     Properties.Settings.Default.Save(); 
     var config = 
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal); 
     config.SaveAs(settingsFilePath); 
    } 
} 

निर्यात विधि की तरह एक फ़ाइल निम्न बनाता है:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <userSettings> 
     <MyApplication.Properties.Settings> 
      <setting name="SineWaveFrequency" serializeAs="String"> 
       <value>1</value> 
      </setting> 
      <setting name="SineWaveAmplitude" serializeAs="String"> 
       <value>100</value> 
      </setting> 
      <setting name="AdcShift" serializeAs="String"> 
       <value>8</value> 
      </setting> 
      <setting name="ControlBitsCheckedIndices" serializeAs="String"> 
       <value>0,1,2,3,5,6,7,8</value> 
      </setting> 
      <setting name="UpgradeSettings" serializeAs="String"> 
       <value>False</value> 
      </setting> 
     </MyApplication.Properties.Settings> 
    </userSettings> 
</configuration> 

आयात विधि उस फ़ाइल को पार्स करता है, नोड के अंदर सब कुछ ले जाता है, कहते हैं कि XML उपयुक्त अनुभाग पर user.config फ़ाइल में, फिर उन मानों को नए user.config फ़ाइल से पकड़ने के लिए Properties.Settings.Default को फिर से लोड करता है।

+0

नोट, आपको सिस्टम का संदर्भ जोड़ना होगा। कॉन्फ़िगरेशन असेंबली। – Pat

0

समाधान पैट ने सुझाव दिया:

// Get the whole XML inside the settings node 
var settings = import.XPathSelectElements("//" + appSettingsXmlName); 

रिटर्न null। मैंने इसे

var settings = import.Element("configuration").Element("userSettings").Element(appSettingsXmlName); 

config.GetSectionGroup("userSettings") 
     .Sections[appSettingsXmlName] 
     .SectionInformation 
     .SetRawXml(settings.ToString()); 

और यह पूरी तरह से काम करता है।