2009-03-13 3 views
3

내 응용 프로그램에 포함되어있는 DLL 프로젝트가 여러 개 있는데, 각각은 자신의 Settings.settings/app.config 파일을 포함하고 있습니다. 응용 프로그램을 컴파일하고 디버깅을 위해 실행하면 모든 것이 잘 작동하지만 배포 시간에 DLL을 가져 와서 자체 설정 파일을 읽을 수 없습니다.여러 클래스 라이브러리에서 구성 정보를 참조하려면 어떻게합니까?

필자는 약간의 독서를 해왔으며 각 dll이 자체 구성을 읽는 데 몇 가지 방법이 있음이 분명해졌습니다. 하나는 .dll.config를 라이브러리에 전용으로 사용하고 다른 하나는 포함시키려는 것입니다. process.exe.config의 dll 구성

구현에 중대한 문제가 있습니다. 누구든지이 문서를 잘 작성했는지 궁금합니다. 인터넷에 부족한 부분이있는 것 같습니다.

가능한 경우 각 라이브러리에 대해 별도의 .dll.config를 사용하고 싶지만, 각 라이브러리에서 process.exe.config의 자체 섹션을 읽는 것이 좋습니다.

누구든지이 응용 프로그램을 실행하는 데 너무 가깝기 때문에 올바른 방향으로 나를 가리킬 수 있습니까? 그러나이 장애물로 인해 심각한 두통이 생깁니다.

편집 : 구성 파일을 병합하면 라이브러리가있는 개체를 초기화 할 때 TypeInitializer 예외가 발생하기 시작합니다. 이것은 내가 막연한 일일 가능성이 있지만 누군가가 병합 된 설정 파일의 실례와 여러 어셈블리에서 그것을 읽는 몇 가지 기본적인 설명 코드를 가지고 있습니까?

답변

2

"중대한 문제"는 무엇입니까? exe의 config에 dll의 설정을 임베드하는 것으로 시작했으나 효과가있었습니다.하지만 번거로운 작업이었습니다. 이제는 하나의 dll 프로젝트에 모든 설정 내용이 있습니다. 설정을 복사하는 것 외에도 작업을 수행하는 데 필요한 유일한 작업은 Settings 클래스를 공개로 변경하는 것이 었습니다.

<?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="SharedConfig.Client.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     <!-- Begin copy from library app.config --> 
     <section name="SharedConfig.Library.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     <!-- End copy from library app.config --> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <SharedConfig.Client.Properties.Settings> 
     <setting name="Bar" serializeAs="String"> 
      <value>BarFromClient</value> 
     </setting> 
     </SharedConfig.Client.Properties.Settings> 
     <!-- Begin copy from library app.config --> 
     <SharedConfig.Library.Properties.Settings> 
     <setting name="Bar" serializeAs="String"> 
      <value>BarFromLibrary</value> 
     </setting> 
     </SharedConfig.Library.Properties.Settings> 
     <!-- End copy from library app.config --> 
    </applicationSettings> 
    </configuration> 
+0

시도했습니다. 이것은 첫 번째 인스턴스에서 나는 그것이 문제에 대한 (조금 더러운 경우) 신속한 수정이라고 생각했기 때문에 이것을 풀어 낼 수있었습니다. 그러나 모든 구성 파일을 병합하는 순간, TypeInitializer 예외가 내 라이브러리 내 객체를 초기화하려고하기 시작했습니다. – BenAlabaster

+0

그렇다면 .dll을 전용으로 사용하려고 시도했습니다.구성 및 나는 자신의 파일을 참조하는 라이브러리를 얻을 수 없다, 나는 그것이 잘못된 일을하고있는 것 같아요 -하지만 OpenExeConfiguration조차도 Settings.settings 파일이 보이지 않기 때문에하고 싶지 않습니다. 업데이트 – BenAlabaster

+0

내 경험에 비추어 볼 때, 각 .dll이 자체 구성을로드 할 때까지는별로 멀지 않았다는 사실에 놀라지 않습니다. 다른 한편으로, 첫 번째 시나리오에 대한 문제로 인해 당황 스럽습니다. 당신이 그들을 합병 한 방법에 대해 뭔가가 있을까요? –

0

각 클래스 라이브러리에 사용자 지정 ConfigurationSection의 구성 설정을 정의하게하십시오.

그런 다음 process.exe.config 파일에 사용자 지정 섹션 처리기를 추가하십시오.

This MSDN article은 VB와 C# 모두에 대한 예와 함께 매우 포괄적입니다.

+0

나는 이것을 과거에해야만했습니다. 라이브러리와 주 어셈블리를 고려하면 많은 작업이 완료 될 것입니다. – BenAlabaster

+0

그래, 꽤 반복적 인 코드를 작성하는 것이 포함된다! Dmitryr는 XML 구성 조각에서 구성 섹션을 생성하는 도구를 만들었습니다. 다음과 같이 도움이 될 수 있습니다. http://blogs.msdn.com/dmitryr/archive/2005/10/02/476245.aspx –

0

If app.config for a DLL should be in the "main config"… what do we do with WCF References in DLLs?를 참조하십시오

여기에 작동하는 병합의 app.config의 예입니다. 진짜 대답은 "복사하여 붙여 넣기"입니다. 불행히도 Microsoft가 염두에두고있는 일반적인 해결책입니다. 경우에 따라 .NET 2.0 설정 메커니즘을 사용하여 기본 값을 DLL 자체로 가져올 수 있습니다. 런타임에 DLL은 업데이트 된 설정을 .exe.config에 저장할 수 있습니다.

+0

DLL 설정을 저장할 필요가 없습니다 - 읽기 전용입니다. 문제는 병합 된 process.exe.config 파일에서 해당 설정을로드하도록 DLL을 가져올 수 없다는 것입니다. 잠시 내가 TypeInitializer 예외를 받기 시작하는 설정 파일을 병합합니다. – BenAlabaster

+0

게시물을 편집하고받는 예외의 예제 (전체 스택 추적, 제발, 모든 내부 예외)를 추가해야합니다. 또한 관련 설정 스 니펫을 제공하십시오. 기본 응용 프로그램에 config 섹션 유형이 포함 된 어셈블리가로드되어 있습니까? –

관련 문제