2010-04-22 3 views
1

여러 응용 프로그램에서 사용할 DLL을 만들고 프로그램 파일에 설치하고 전역 어셈블리 캐시에 추가하는 설치 관리자 패키지를 만들었습니다.dll 상속에 관한 문제

dll 자체는 log4net을 사용하며 로깅 정의를위한 xml 파일이 필요합니다. 설치 프로그램이 실행될 때

은 따라서 다음 파일 프로그램 파일 내에 설치 디렉토리에 복사됩니다 : 내가 을 개발 주요 DLL - Log4Net.dll -

내가 오전 Log4Net.xml 파일 지금 문제가 발생했습니다. 실험을위한 테스트 콘솔 애플리케이션을 만들었습니다. 내 dll을 참조로 추가하고 '로컬 복사본'플래그를 false로 설정합니다.

그러나 테스트 콘솔 exe를 컴파일 할 때 log4net.dll 및 log4net.xml 파일이 bin 디렉토리에 복사 된 것으로 나타났습니다. 그리고 테스트 콘솔을 실행할 때 log4net.dll이 exe와 같은 디렉토리에있는 경우에만 작동하는 것으로 보입니다. 이것은 테스트 콘솔 어플리케이션이 log4net을 사용하지 않는다는 사실을 나타냅니다. 참조로 추가 된 dll만이 사용됩니다.

log4net.dll & xml 파일이 로컬 복사본을 통해 복사해야하는 응용 프로그램이 아닌 프로그램 파일에 설치된 파일이되도록 몇 가지 방법이 있습니까? 내 DLL을 사용하는 응용 프로그램은 log4net을 사용하지 않고 참조하는 dll 만 사용합니다.

많은 감사

답변

2
  1. 전역 어셈블리 캐시에 설치하지 마십시오! 라이브러리 dll이 여러 응용 프로그램에서 사용 되더라도 각각의 로컬 복사본이 있어야합니다. 그렇지 않으면 몇 킬로미터의 디스크 공간을 절약 할 수있는 고통에 빠지게됩니다.
  2. 항상 필요한 dll을 로컬로 복사하십시오. 응용 프로그램에서 필요하지 않다고 확신하는 경우 나중에 unnessesary dll을 삭제하거나 설치 프로그램에 포함시키지 마십시오. 하지만 응용 프로그램에서 참조를 호출하면 런타임에 충돌이 발생합니다. 따라서 최선의 선택은 (이유를 들어 언급 한 후에) 거기에 두는 것입니다.
  3. 아니요. (적어도 많은 감각이 없어도) .Net의 dll은 디스크의 임의 위치에서로드 할 수 없습니다. 그리고 그것은 왜 이런 식으로해야합니다 (이유를 알고 싶다면 DLL 지옥 찾기).
+0

불행히도 DLL의 로컬 복사본을 사용하는 것은 옵션이 아닙니다. 클라이언트가 실행할 수있는 독립 실행 형 exe를 원하기 때문에 프로젝트의 요구 사항 때문입니다. 그래서 내 DLL을 GAC에 추가했습니다. – Adam

+1

그건 돼지 립스틱이에요. 그것은 독립 실행 형 exe가 아닌 * GAC에 어셈블리가 필요하고 XML 파일을 구성하는 어딘가에 있어야합니다. "독립 실행 형 exe"를 갖는 유일한 요점은 설치 프로그램이 필요 없다는 것입니다. 그것은 날지 않을 돼지 다. –

+0

호스트 시스템의 임의의 디렉토리에서 실행될 수있는 독립형이어야합니다. 클라이언트는 exe 파일과 지원되는 DLL/xml 파일로 가득 찬 디렉토리가 아닌 실행 가능한 exe로 가득 찬 깨끗한 디렉토리를 원합니다. 실제로 log4net.dll을 GAC에 추가하여 실제로 작동 시켰습니다. 단, x4 파일을 가져 오지 않는 문제가 있습니다. 그러나 앞으로 나아갈 단계입니다. 나는 그것이 최상의 해결책이 아닐지도 모른다는 생각에 동의합니다. 그러나 그것은 내 디자인이 아니며 고객이 원하는 프레임 워크에 국한됩니다. 많은 분들께 감사드립니다. – Adam

0

구성에 문제가있는 것으로 판단됩니다. GAC에서 작동하려면 정규화 된 이름을 사용해야합니다.

는 표준 구문 System.Type 지원 지정해야합니다 버전, 문화, 공개 키를 포함하여 GAC에서 정규화 된 어셈블리 이름을 어셈블리를로드 할 때

"이된다. http://logging.apache.org/log4net/release/faq.html의 문서에 따라 .GetType. 어셈블리의 버전과 공개 키를 얻는 방법에 대한 다음 FAQ를 참조하십시오. "

+0

업데이트 해 주셔서 감사합니다. 그러나 appender를 어떻게 변경해야하는지 혼란 스럽습니다. 다음은 내 appender 태그입니다. 그러면 appender-ref를 참조하십시오. 즉 : 실제로 GAC에있는 클래스의 이름을 사용합니까? – Adam

+0

나는 방금 문서에 있던 것을 꺼냈다. Log4net을 GAC에 넣으면 설정에서 전체 이름을 사용해야한다는 것입니다. 리플렉션을 통해 객체 인스턴스를 만들면 유형 이름에 버전과 공개 키가 포함되어 있지 않으면 GAC에서 인스턴스를 만들 수 없다는 것을 알고 있습니다. –

0

Log4net.dll도 GAC에 추가하여 문제를 해결할 수있었습니다. 이제 dll의 로컬 복사본이 필요없이 실행됩니다.

올바르게 기록하려면 XML 파일의 로컬 복사본이 필요합니다.