2010-03-05 22 views
9

reading settings from a separate config file ve buna benzer diğer sorularla ilgili sorular vardır, ancak sorum şu uygulama özellik ayarlarına özeldir (örn. <MyApplication.Properties.Settings> - aşağıdaki XML dosyasına bakın) ve bunların dinamik olarak nasıl yükleneceği. Ben ana yapılandırma dosyasının tamamını appSettings bölüm ferahlatıcı dahil this post yöntemi, çalıştım, ama appSettings bölüm değiştirme değildi çünkü benim adaptasyon istisnalar attı: ConfigurationErrorsException.Message olduğunuAyrı bir Uygulama Ayarları dosyası dinamik olarak nasıl yüklenir ve geçerli ayarlarla birleştirilir?

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

"kök öğe, başvurulan bölümün adı olan 'appSettings' (C: \ myFile.xml satır 2) ile eşleşmelidir. dosyasıdır: MyApplication.Properties.Settings.Default sınıfa bu dosyadan değerleri aktarmak için bir yol yapılandırma dosyası uygulama başlangıçta yüklendiğinde öyle gibi tüm XML deserialization taşıma çerçevesi ile,

<?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> 

var mı?

+0

Motivasyonu merak ediyorsanız, önceki soruma bakın: [Tüm uygulama verilerini kaydetmek ve geri yüklemek için .NET yapılandırma dosyaları (app.config, settings.settings) nasıl kullanılır?] (Http: // stackoverflow. com/sorular/1869628/nasıl kullanımlı-net-yapılandırma-files-app-config-settings-ayarlar-to-save-ve-r). O zaman, app.config ve user.config arasındaki farkı bilmiyordum, ama kesinlikle user.config'i değiştirmek için bir çözüm arıyorum. – Pat

cevap

7

Eh, bu çalışır:

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

ihracat yöntemi aşağıdaki gibi bir dosya oluşturur:

<?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> 

ithalat yöntemi, bu dosyayı ayrıştırır düğüm içindeki her şeyi aldığını koyar XML user.config dosyasına uygun bölümde, sonra bu değerleri yeni user.config dosyasından almak için Properties.Settings.Default'u yeniden yükler. Patenti tarafından da önerilmiştir

+0

Not, System.Configuration grubuna bir başvuru eklemeniz gerekir. – Pat

0

çözeltisi:

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

döner null. Ben

Ve mükemmel çalışır.

İlgili konular