2010-03-05 1 views
9

reading settings from a separate config file 및 기타 유사한 질문이 있지만 내 질문은 응용 프로그램 속성 설정 (예 : <MyApplication.Properties.Settings> - 아래 XML 파일 참조) 및 동적으로로드하는 방법과 관련되어 있습니다. 나는 주 설정 파일의 전체 appSettings는 섹션을 새로 고침 참여 this post의 방법을 시도,하지만 난 appSettings는 섹션 교체되지 않았기 때문에 내 적응은 예외를 던진 다음 ConfigurationErrorsException.Message은별도의 응용 프로그램 설정 파일을 동적으로로드하고 현재 설정과 병합하는 방법은 무엇입니까?

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

"루트를 요소는 파일 'appSettings'(C : \ myFile.xml 2 행)를 참조하는 섹션의 이름과 일치해야합니다. " 이 파일은 다음과 같습니다 MyApplication.Properties.Settings.Default 클래스로이 파일에서 값을 가져올 수있는 방법은 설정 파일이 응용 프로그램 시작에로드 할 때이하는 것처럼 모든 XML 직렬화를 처리 프레임 워크,

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

있습니까?

+0

궁금한 점이 있으시면 이전 질문 [.NET 구성 파일 (app.config, settings.settings)을 사용하여 모든 응용 프로그램 데이터를 저장하고 복원하는 방법] (http : // stackoverflow. com/questions/1869628/net-configuration-files-app-config-settings-settings-to-save-and-r)을 참조하십시오. 그 당시에는 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 파일에 추가 한 다음 Properties.Settings.Default를 다시로드하여 새 user.config 파일에서 해당 값을 가져옵니다. 팻 제안

+0

참고, System.Configuration 어셈블리에 대한 참조를 추가해야합니다. – 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()); 

으로 바 꾸었습니다. 완벽하게 작동합니다.

관련 문제