2009-09-28 4 views
0

두 개의 프로젝트가 있습니다. 하나는 클래스 라이브러리 (.dll 어셈블리)이고 다른 하나는 클래스 라이브러리를 사용하는 GUI (.exe)입니다.클래스 라이브러리에서 여러 .settings 클래스를 사용하는 방법?

클래스 라이브러리에서 모든 "응용 프로그램"설정을 사용하여 두 개의 .settings 파일 (프로젝트에 app.config 파일을 자동으로 추가 함)을 추가했습니다. 프로젝트를 컴파일 할 때 출력 디렉터리에서 MyLib.dll.config 파일을 효과적으로 가져옵니다.

이제 GUI 프로젝트의 경우 클래스 라이브러리를 참조하고 MyLib.dll.config를 bin \ debug (및 release) 폴더에 수동으로 복사합니다.

GUI 응용 프로그램에서 MyLib.dll.config 설정을 가져 오려고했지만 지금까지 작동하지 않습니다. .settings 클래스를 public으로 설정하려고 시도했지만 성공하지 못했습니다.

OpenMappedExeConfiguration() 메서드에 대해 읽었지만 반환 된 구성에서 설정을 찾지 못하는 것 같습니다. 또한, 어떻게 OpenMappedExeConfiguration에 의해 반환 된 구성을 사용하도록 .settings 클래스를 강제 할 것인가?

참고 : MyLib.dll.config의 항목을 GUI 응용 프로그램의 app.config에 수동으로 추가하지 않으려합니다. 해당 항목이 전혀 포함되어 있지 않기 때문입니다.


추가 참고 :

I가 가지고있는 .config 파일 : 두 섹션을 포함하는 SectionGroup이 있음을

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="TestAssembly.ItemClass" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
      <section name="TestAssembly.Entity" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <TestAssembly.ItemClass> 
      <setting name="Job" serializeAs="String"> 
       <value>TrussPlant.Job</value> 
      </setting> 
      <setting name="Family" serializeAs="String"> 
       <value>TrussPlant.Family</value> 
      </setting> 
     </TestAssembly.ItemClass> 
     <TestAssembly.Entity> 
      <setting name="TrussClassifier" serializeAs="String"> 
       <value>TrussPlant.Classifier</value> 
      </setting> 
      <setting name="TrussComposer" serializeAs="String"> 
       <value>TrussPlant.Composer</value> 
      </setting> 
     </TestAssembly.Entity> 
    </applicationSettings> 
</configuration> 

참고.

답변

1

이 같은 뭔가가 \ 등록 \ Settings.Designer.cs :.

:

namespace _SampleApplication.Properties { 
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] 
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 
... 

그런 다음, 다음 코드를 사용하여 DLL 프로젝트에서 다른 파일이 추가 할 수 있습니다

namespace _SampleApplication.Properties { 
    partial class Settings 
    { 
     static System.Configuration.Configuration _config = null; 

     private System.Configuration.Configuration DllConfig 
     { 
      get 
      { 
       return _config != null ? _config : 
        _config = System.Configuration.ConfigurationManager.OpenExeConfiguration(this.GetType().Assembly.Location); 
      } 
     } 

     public override object this[string propertyName] 
     { 
      get { return DllConfig.AppSettings.Settings[propertyName].Value; } 
      set { DllConfig.AppSettings.Settings[propertyName].Value = value as string; } 
     } 
    } 
} 

'해킹'솔루션에 대한 자세한 내용을 제대로 수행하는 방법을 모르지만 작동합니다.

+0

좋은 생각이지만 컴파일러에서 허용하지 않는 DllConfig.AppSettings [propertyName]의 오류 인 것 같습니다. 대신 DllConfig.AppSettings.Settings 시도하고 여전히 작동하지 않습니다. 심지어는 DllConfig.AppSettings.Properties를 사용하려고했지만 내부적으로 보호 된 것으로 선언되었습니다 ... –

+0

죄송합니다.이 [string] 구현을 실제로 컴파일해야하지만 아직 테스트가 진행 중입니다. * 일. –

0

일반적으로 구성 설정은 구성 요소가 아닌 응용 프로그램에 속해야합니다.

구성 요소는 자체 설정을 읽을 수 있어야하므로 설정을 읽은 구성 요소에 메서드를 추가 한 다음 해당 메서드를 응용 프로그램에서 호출합니다. 당신의 DLL 프로젝트를 가정