2011-01-05 9 views
6

나는 다음과 같은 프로젝트가 :.NET의 .config 지옥

  1. MVC를
  2. 콘솔 응용 프로그램
  3. 클래스 라이브러리는
  4. Windows가 형성 응용 프로그램
  5. COM 라이브러리

이러한 모든 애플리케이션은 단일 구성 파일을 사용하십시오. 아득히 app.config 파일은 web.config가 웹 프로젝트 용인 경우 Windows, 콘솔 응용 프로그램 및 클래스 라이브러리 용입니다.

이러한 모든 프로젝트에서 동일한 구성에 액세스 할 수 있어야합니다. 컴퓨터 구성 파일을 사용하는 것이 좋지만 항상 액세스 할 수있는 것은 아니므로 구성 파일이 우리 솔루션 내에 있어야합니다.

구성 파일의 빌드 방법을 완전히 이해하지 못했습니다. 현재 다음과 같은 간단한 프로젝트를 작성했습니다 :

  1. 구성 파일 제공을 위해 저장할 클래스 라이브러리. A는 이것을 반영하여 이것을 시도했습니다.
  2. 클래스 라이브러리에서 app.config를 읽어야하는 Windows 응용 프로그램입니다. 나는 다음과 같은 코드를 실행하면

나는 시험 값으로 설정 파일을 얻을 것으로 기대 : 내가 대신 얻는 것은 빈 응용 프로그램 설정 파일입니다

_applicationSettings = ConfigurationManager.OpenExeConfiguration(
        System.Reflection.Assembly.GetAssembly(typeof(WCSConfiguration)).Location 
        ).AppSettings;  

.

클래스 라이브러리는 다음의 App.config를 가지고 : 나는 현재 실행되고있어 코드의 어셈블리를 반환 할 것으로 예상 .GetExecutingAssembly() 방법을 사용하여 시도

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="TestTextKey" value="TestTextValue"/> 
    </appSettings> 
</configuration> 

. 이것은 작동하지 않고 대신 Windows 응용 프로그램의 어셈블리를 반환했습니다.

GetAssembly(type(WCSConfiguration))이 올바른 어셈블리를 반환했지만 구성 파일이 bin/debug 디렉토리에 없습니다.

나는 근본적으로 잘못된 것을하고 있거나 Microsoft가 충분히 유연하게 만들지 못했다고 생각합니다. 나는 또한 설명을 위해 MSDN을 검색하려고 시도했지만 이것은 잘 설명되어 있지 않다.

COM 라이브러리에서 설정 파일을 사용할 수 있는지 여부가 확실치 않아 COM을 굵게 표시했습니다. 우선 다른 프로젝트를 시작하고 싶습니다.

나는 이것이 많은 정보라는 것을 알고 있습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 이전에 우리는 레지스트리를 사용하기로 결정했으나 일부 ​​시나리오에서는 레지스트리에 대한 액세스가 불가능하기 때문에이 방법은 불쾌한 것으로 판명되었습니다.또한 우리는 이제 응용 프로그램의 여러 버전을 가지고 나뭇 가지 사이를 전환하는 것은 반 한 시간 작업 :(

편집 감사입니다 : 내가 DLL의 설정 섹션을 추가하는 경우

가의 app.config하기를 즉,이 설정은 해당 응용 프로그램에서만 사용할 수 있습니다. 제가 틀렸다고 정정하십시오. 제가 제공 한 예제는 축소 된 버전입니다. 총 10 개의 Windows 응용 프로그램, 하나의 MVC 프로젝트 및 클래스 범위가 있습니다. 이 라이브러리는 모두 해당 구성을 사용해야합니다.

구성 설정은 대부분 연결 문자열이며 데이터베이스에 속하지 않는 조회 값이며 다른 작은 설정은 거의 없습니다. 이 시점에서 주요 관심사는 연결 문자열입니다. 각 릴리스가 다른 데이터베이스를 가리키는 응용 프로그램의 사소한 릴리스가 거의 없습니다.

나는 이것을 꺼내고 싶습니다. 온라인에서 게시 할 수 있고 같은 문제를 겪고있는 다른 사람들이 시간을 보내지 않을 것입니다.

IMO : 자신의 구성 파일의 위치를 ​​저장하려면 App.config와 Web.config를 모두 사용하십시오.

구성을 제공하기 위해 읽기/쓰기 구성 및 DLL에 간단한 XML serializer를 작성합니다.

COM 개체는 길쭉한 이야기이며 COM DLL에서 App.config 또는 Web.config를 사용할 수 없으므로 "해킹"으로 구현되었습니다.

+0

임의의 구성 파일을 여는 데 http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.openmappedexeconfiguration.aspx를 사용해 보셨나요? 당신이 가리킬 수있는 공유 위치에 공유 구성 파일이 있다고 생각합니다. –

+0

나는 이것을 사용하려했다. OpenMappedExeConfiguration은 클래스 라이브러리에 대한 설정을 반환한다고 생각했던 OpenMappedMachineConfiguration보다 실행 파일에서 작동하지만 둘 다 작동하지 않습니다. –

+0

OpenMappedExeConfiguration은 모든 종류의 구성에서 작동합니다. 실행 파일에서 작동한다는 것을 이해하지 못합니까? 내 webapplications에 대한 구성 파일을 여는 데 매일 사용합니다. –

답변

4

참고 ConfigurationManager.OpenExeConfiguration은 실행 파일이 아니라 구성 파일의 파일 이름을 전달해야합니다.

.config을 실행 파일의 경로에 추가해야합니다. exe 어셈블리를 얻으려면 Assembly.GetEntryAssembly을 사용하십시오. 당신은 당신이 같은 .NET 프로세스에서 모든입니다 코드의 여러 부분에 걸쳐 공유 할 구성 설정이있는 경우

, 내가 제안 :

  • myStuff.config 자신에 넣어.
  • .NET 코드에서 을 열고 액세스하려면 ConfigurationManager.OpenExeConfiguration을 사용하십시오.
  • 비 .NET 코드는 설정을로드하고 읽는 데 XML 파서를 사용해야합니다. 구성 구조가 매우 복잡하지 않으면 캡슐화하기가 너무 어려워서는 안됩니다.
  • .NET 응용 프로그램에 대해이 구성을 공유하는 각 응용 프로그램의 app.config에 경로를 myStuff.config으로 지정하십시오. (NET 응용 프로그램이 아닌 : 해당 응용 프로그램에 적용되는 작업에 따라 다름).)

구성 구조가 동일하지만 설정이 응용 프로그램마다있는 또 다른 접근 방식은 사용자 지정 구성 섹션입니다.

+0

나는 이것을 지금 줄 것이다. bin/debug 디렉터리에 App.config가 있고 같은 디렉터리에 WindowsFormApplication1.exe.config가 있습니다. 내 클래스 라이브러리에 대한 ConfigurationLib.dll.config가있을 것으로 기대하지만, 거기에 없습니다. –

1

몇 가지 일반적인 점 - dll 구성 파일을 사용하기보다는 app.config 파일에 dll 구성 섹션을 추가하십시오. app.config는 실제로 빌드시 .exe.config로 이름이 변경되므로 해당 이름의 파일을 사용할 수 있어야합니다.

또한 기본 구성로드 메커니즘을 사용하여 응용 프로그램을 구성 할 필요가 없습니다. 자신 만의 구성 클래스를 만들고 XML 직렬화를 사용하여 원하는대로 비 직렬화 및 구성을 수행 할 수 있습니다.

+0

안녕하세요. dll의 config 섹션을 app.config에 추가하면이 설정은 해당 응용 프로그램에서만 사용할 수 있습니다. 이 말이 맞습니까? 내가 제공 한 예제는 축소 된 버전입니다. 총 10 개의 Windows 응용 프로그램, 단일 MVC 프로젝트 및 해당 구성을 사용해야하는 모든 클래스 라이브러리가 있습니다. –

+3

나는 기본적으로 .net 메커니즘을 사용하지 않고 자신의 XML 직렬화 된 구성 클래스의 구성 정보를 제공 할 수있는 독립형 구성 라이브러리를 만드는 것을 심각하게 고려할 것입니다. –

+0

즉, .NET 2+에서 비 기본 구성 파일로 리디렉션 할 수도 있습니다. 예를 들어 MSDN에서 ConfigurationManager.OpenMappedExeConfiguration을 조회하면 .NET 응용 프로그램의 경우 최소한 하나의 구성 파일에 매핑 할 수 있습니다. –