ASP.NET log4net의 버젼 차이에 따른 문제 해결

ASP.NET log4net의 버젼 차이에 따른 문제 해결

log4net 버젼 차이에 따른 문제

프로젝트 A : 새로운 프로젝트. 당연히 log4net도 최신 버젼을 도입합니다. 하지만 프로젝트 B의 비지니스 로직을 참고해야 합니다…

# log4net 버젼 : 1.2.15.0

프로젝트 B : 공통 비지니스 로직을 포함하고 있는 오래된 프로젝트로 log4net의 버젼도 당연히 옛날 버젼 입니다…

# log4net 버젼 : 1.2.10.0

… 그리고 상기의 사양대로 코딩을 했더니 프로젝트 A가 단독으로 움직일때는 문제가 없지만 프로젝트 B의 로직을 호출(Add References로 dll 참조)하면 프로젝트 B에서 로그를 출력하는 타이밍에서 에러가 발생했습니다.

에러 메세지

Could not load file or assembly 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference (HRESULT:0x80131040)

해결 방법

1. 웹 어플의 경우

1-1. 웹 어플이 인식 가능한 장소에 「log4net.1.2.10」의 dll를 격납합니다.

1-2. Web.config에 웹 어플이 사용할 최신 버젼의 log4net와 「log4net.1.2.10」의 선언을 추가합니다.

「log4net.1.2.10」를 선언시에 1-1에서 격납한 「log4net.1.2.10」의 dll이 있는 패스를 정확하게 기입합니다.

프로젝트 A의 Web.config

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
	<assemblyIdentity name="log4net" culture="neutral" publicKeyToken="669e0ddf0bb1aa2a" />
	<!-- <codeBase version="1.2.15.0" href="log4net.dll" /> 자신이 사용하는 log4net의 버젼은 기입하지 않아도 상관없음 -->
	<bindingRedirect oldVersion="0.0.0.0-1.2.15.0" newVersion="1.2.15.0" />
  </dependentAssembly>
  <!-- B 프로젝트용 기입 -->
  <dependentAssembly>
	<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
	<!-- 프로젝트 폴더로 부터의 상대경로
	이번 케이스의 경우엔 log4net.dll를 「C:\project\A\bin\log4net.1.2.10」 안에 격납하고 있다. -->
	<codeBase version="1.2.10.0" href="bin\log4net.1.2.10\log4net.dll" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

실제 폴더는 이렇게 되어 있습니다.
C:\project\A\bin\에 해당하는 장소가 됩니다.

0044-1.png

웹 배포(Publish)시의 주의사항

배포 설정(Package/Publish Web)을 「All files in this project folder」로 설정하지 않으면 상기에 설정한 낮은 버젼의 log4net의 내용이 반영되지 않기 때문에 주의합니다.

0044-2.png

2. Console 어플의 경우

2-1. Console 어플이 인식가능한 장소에 「log4net.1.2.10」의 dll을 격납합니다.

※ configuration의 모든 종류(ex)debug/release)에 격납을 시킬 필요가 있습니다.

2-2. App.config에 어플이 사용할 최신 버젼의 log4net와 「log4net.1.2.10」의 선언을 추가합니다.

「log4net.1.2.10」를 선언시에 2-1에서 격납한 「log4net.1.2.10」의 dll이 있는 패스를 정확하게 기입합니다.

프로젝트 A의 App.config

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
	<assemblyIdentity name="log4net" culture="neutral" publicKeyToken="669e0ddf0bb1aa2a" />
	<!-- <codeBase version="1.2.15.0" href="log4net.dll" /> 자신이 사용하는 log4net의 버젼은 기입하지 않아도 상관없음 -->
	<bindingRedirect oldVersion="0.0.0.0-1.2.15.0" newVersion="1.2.15.0" />
  </dependentAssembly>
  <!-- B用 -->
  <dependentAssembly>
	<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
	<!-- 배치 실행 파일(ex)C:\project\A\bin\Release\A.exe) 기준의 상대경로.
	이번 케이스의 경우엔 log4net.dll를 「C:\project\A\bin\Release\log4net.1.2.10」안에 격납하고 있다.
	-->
	<codeBase version="1.2.10.0" href="bin\log4net.1.2.10\log4net.dll" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

Pie's Tech Note

생계형 개발자의 메모장

comments powered by Disqus

    rss facebook twitter github youtube mail spotify instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora