[c#] 클래스 라이브러리 용 app.config

VS2008 마법사에서 클래스 라이브러리에 대해 생성 된 app.config 파일을 볼 수 없습니다. 내 연구에서 응용 프로그램에는 app.config가 하나만 존재한다는 것을 발견했습니다.

app.config를 클래스 라이브러리에 수동으로 추가하는 것이 나쁜 일입니까? 아니면 클래스 라이브러리에서 app.config의 목적을 제공하는 다른 메서드가 있습니까?

app.config 파일에 log4net 구성 정보를 저장해야합니다.



답변

일반적으로 클래스 라이브러리 프로젝트에 파일을 추가 해서는 안됩니다app.config . 고통스러운 구부리거나 뒤틀림 없이는 사용되지 않습니다. 그것은 도서관 프로젝트를 전혀 해치지 않습니다. 단지 아무것도하지 않을 것입니다.

대신 라이브러리를 사용하는 응용 프로그램을 구성합니다. 따라서 필요한 구성 정보가 여기로 이동합니다. 라이브러리를 사용할 수있는 각 응용 프로그램에는 다른 요구 사항이있을 수 있으므로 실제로 논리적으로도 의미가 있습니다.


답변

이 답변이 아직 제공되지 않은 이유를 모르겠습니다.

동일한 라이브러리의 다른 호출자는 일반적으로 다른 구성을 사용합니다. 이는 구성 이 클래스 라이브러리가 아닌 실행 가능한 응용 프로그램 에 있어야 함을 의미합니다 .

클래스 라이브러리 프로젝트 내에서 app.config를 만들 수 있습니다. 라이브러리 내에서 생성 한 항목에 대한 기본 구성이 포함됩니다. 예를 들어 클래스 라이브러리 내에서 Entity Framework 모델을 만드는 경우 연결 문자열이 포함됩니다.

그러나 이러한 설정은 라이브러리를 호출하는 실행 가능한 응용 프로그램에서 사용되지 않습니다. 대신 이러한 설정을 library.dll.config 파일에서 호출자의 app.config 또는 web.config로 복사하여 호출자 및 호출자가있는 환경에 맞게 변경할 수 있습니다. 배포.

이것이 1 일차부터 .NET과 함께해온 방식입니다.


답변

Jon, 귀하의 질문에 올바르게 대답하지 않은 많은 의견이 제공되었습니다.

내 의견을 제시하고 요청한 것을 정확히 수행하는 방법을 알려 드리겠습니다.

어셈블리에 자체 구성 파일이 없을 이유가 없습니다. 원자 성의 첫 번째 수준 (진짜 단어입니까?)이 응용 프로그램 수준에있는 이유는 무엇입니까? 솔루션 수준이 아닌 이유는 무엇입니까? 그것은 임의적이고 최선의 결정이며 따라서 의견입니다. 로깅 라이브러리를 작성하고 이에 대한 구성 파일을 포함하려는 경우 전역 적으로 사용되는 경우 내장 설정 기능에 연결할 수없는 이유는 무엇입니까? 우리는 모두 해냈습니다. 다른 개발자에게 “강력한”기능을 제공하려고 노력했습니다. 어떻게? 본질적으로 제한으로 해석 된 가정을합니다. 이것이 바로 MS가 설정 프레임 워크로 수행 한 작업이므로 약간 “만약”해야합니다.

질문에 직접 답하려면 구성 파일 (xml)을 수동으로 추가하고 라이브러리와 일치하고 “config”확장자를 포함하도록 이름을 지정하십시오. 예:

MyDomain.Mylibrary.dll.Config

다음으로 ConfigurationManager를 사용하여 파일을로드하고 설정에 액세스합니다.

string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath);
string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;

앱 구성 파일을 명시 적으로 선택 했더라도 이것은 machine.config 계층 구조를 완전히 지원합니다. 즉, 설정이 없으면 더 높게 해결됩니다. 설정은 machine.config 항목도 무시합니다.


답변

실제로 구현중인 클래스 라이브러리는이를 사용 하는 애플리케이션 내부의 app.config 에서 정보를 검색 하므로 VS의 .net에서 클래스 라이브러리에 대한 구성을 구현하는 가장 올바른 방법은 다음에서 app.config 를 준비 하는 것입니다. 라이브러리 구성과 같이 소비하는 모든 것을 구성하는 응용 프로그램입니다.

나는 log4net으로 약간 작업했으며 응용 프로그램을 준비한 사람은 항상 main app.config 내에 log4net 구성 섹션이 있음을 발견했습니다 .

이 정보가 도움이 되셨기를 바랍니다.

만나서 찾은 솔루션에 대한 의견을 게시하십시오.

편집하다:

다음 링크에는 app.config가 있습니다. log4net 섹션 가 있습니다.

http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx


답변

클래스 라이브러리를 사용하는 동안 log4Net을 사용하여 프로젝트 로깅을 구성하려는 경우 실제로 구성 파일이 필요하지 않습니다. 클래스에서 log4net 로거를 구성하고 해당 클래스를 라이브러리로 사용할 수 있습니다.

log4net은이를 구성하는 모든 옵션을 제공합니다.

아래 코드를 찾으십시오.

public static void SetLogger(string pathName, string pattern)
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = pattern;
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = pathName;
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            MemoryAppender memory = new MemoryAppender();
            memory.ActivateOptions();
            hierarchy.Root.AddAppender(memory);

            hierarchy.Root.Level = log4net.Core.Level.Info;
            hierarchy.Configured = true;
      }

이제 XmlConfigurator.Configure (new FileInfo ( “app.config”))를 호출하는 대신 원하는 경로와 패턴으로 SetLogger를 직접 호출하여 Global.asax 응용 프로그램 시작 기능에서 로거를 설정할 수 있습니다.

그리고 아래 코드를 사용하여 오류를 기록하십시오.

        public static void getLog(string className, string message)
        {
            log4net.ILog iLOG = LogManager.GetLogger(className);
            iLOG.Error(message);    // Info, Fatal, Warn, Debug
        }

다음 코드를 사용하면 web.config 응용 프로그램이나 라이브러리의 app.config 내부에 한 줄을 쓸 필요가 없습니다.


답변

실제로 드물게 클래스 라이브러리에 app.config를 저장하고 (수동으로 추가하여) OpenExeConfiguration으로 구문 분석 할 수 있습니다.

 var fileMap =
    new ExeConfigurationFileMap {ExeConfigFilename =
    @"C:\..somePath..\someName.config"};
 System.Configuration.Configuration config =
    ConfigurationManager.OpenMappedExeConfiguration(fileMap,
    ConfigurationUserLevel.None);

이것의 실제 필요성을 정말로 추정해야합니다. 추상 데이터의 경우 최상의 솔루션은 아니지만 “구성 섹션”이 매우 유용 할 수 있습니다 !!

예를 들어, 채널 팩토리 T를 기반으로 Unity Container 및 Injection Factory를 사용하여 메타 데이터없이 분리 된 N-Tier WCF 아키텍처를 구성했습니다. [서비스 계약] 인터페이스와 공통 app.config 만있는 externall ClassLibrary dll을 순서대로 추가했습니다. 클라이언트 섹션에서 엔드 포인트를 읽고 한곳에서 쉽게 추가 / 변경할 수 있습니다.


답변

당신은 추가 하시겠습니까 의 App.config를 당신에게 테스트 당신이 추적 / 로거를 사용하는 경우, 클래스 라이브러리. 그렇지 않으면 TestDriven.Net과 같은 테스트 실행기를 통해 테스트를 실행할 때 아무것도 기록되지 않습니다 .

예를 들어 TraceSource프로그램에서 사용하지만 추적 / 로그 구성이 있는 App.config 파일을 테스트 클래스 라이브러리에 추가하지 않는 한 테스트를 실행해도 아무것도 기록되지 않습니다 .

그렇지 않으면 App.config 를 클래스 라이브러리에 추가 해도 아무 작업도 수행되지 않습니다.