log4net에서 publickeytoken을 계속 변경하려면 어떻게해야하나요?


99

log4net 버전 1.2.10.0에 의존하는 몇 가지 프레임 워크를 사용하는 asp.net 4.0 프로젝트가 있습니다. 오늘 저는 log4net 버전 1.2.11.0에 의존하는 새로운 프레임 워크를 포함하려고 노력했습니다.

log4net 1.2.10.0에는 publickeytoken = 1b44e1d426115821이 있습니다.

log4net 1.2.11.0에는 publickeytoken = 669e0ddf0bb1aa2a가 있습니다.

이들은 다르기 때문에 web.config의 런타임 요소를 통해 어셈블리 리디렉션 (모든 프레임 워크가 동일한 버전의 log4net을 사용하도록 함) 또는 코드베이스 (새 프레임 워크 만 버전 1.2.11.0을 사용하도록 함)를 사용할 수 없습니다.

여기서 내 옵션은 무엇입니까?

(그리고 왜 log4net이 버전간에 공개 키 토큰을 계속 변경하는 삐 소리가 나는지 이해합니다. 키를 잃어버린 것이 버전 1.2.9.0과 1.2.10.0 사이의 전환의 이유 였음을 이해합니다. 그들은 키를 다시 잃어 버렸나요? 필요한 경우 안전하게 보관하기 위해 ...)

편집 : 좋아, 그래서 log4net 사람들은 두 개의 키로 릴리스하는 것이 좋은 생각이라는 생각을 분명히 가지고 있었지만 사용 하는 모든 프레임 워크가 선호하는 두 가지 버전 에 동의해야 함을 의미 합니다. 동일한 appdomain에서 나란히. 이 끔찍한 아이디어를 찾는 유일한 사람입니까? 모두가 이렇게하면 모든 것이 무너질 것입니다.

Edit2 : 내가 언급했듯이 비즈니스 코드에서 log4net을 사용하지 않지만 1.2.10.0에 의존하는 여러 프레임 워크를 사용하고 있으며 1.2.11.0 (새 키 ), 따라서 Stefans 대답은 적용되지 않습니다. 새로운 프레임 워크는 이전 키가 아닌 새 키를 예상하기 때문입니다.


1
IMHO, 아파치의 첫 번째 오류는 새 키로 서명 된 바이너리를 제공하는 것입니다. 새 키는 패치 된 / 향상된 오픈 소스 버전을위한 것이며 그대로 사용해서는 안됩니다. 두 번째 오류는 당신이 말하는 프레임 워크가 새로운 log4net 서명으로 만 릴리스되었다는 것입니다. 이전 서명을 가진 버전이 있어야합니다.
JoeBilly

6
실제로 SAP의 천재들이 Visual Studio 용 Crystal Reports 패키지의 일부로 자신의 강력한 이름으로 재 컴파일 한 세 번째 버전을보고 있습니다. 설상가상으로 GAC에 갇혀서 시스템 간의 종속성은 악몽입니다.
Jeremy Holovacs

답변:


65

이것이 내가 버전 1.2.11.0으로 작업하는 방법입니다.

  1. 애초에 키를 변경하는 저주 아파치 :)
  2. 이전 키로 서명 된 1.2.11.0 버전을 다운로드 합니다.
  3. log4net (새 키)에 대한 직접 참조를 제거하여 자신의 코드를 분류하고 이전 키로 서명 된 어셈블리에 대한 참조로 바꿉니다.
  4. web / app.config에이 세그먼트를 포함하여 보유 할 수있는 모든 종속 어셈블리를 정렬합니다.
   <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.2.10.0"
                                 newVersion="1.2.11.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>

9
불행히도 다른 공개 키를 사용하여 어셈블리에 바인딩 리디렉션을 수행 할 수 없으므로 이전 공개 키로 서명 된 버전을 다운로드해야합니다.
David Christiansen

2
이것은 1.2.11.0의 주요 변경으로 인해 실패한 것 같습니다 : netpl.blogspot.com/2012/03/…
sydneyos

@sydneyos가 언급 한 링크에 설명 된 문제에 대한 해결책을 찾은 사람은 다음과 같은 예외를 유발합니다.Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Neo

안타깝게도 1.2.10으로 다운 그레이드하는 것 외에 다른 해결책은 없습니다. (또는 사용하는 모든 종속 어셈블리를 다시 컴파일).
bk0 2013-09-05

1
1.2.10 어셈블리를 다른 디렉터리에 넣고 다음 구성을 사용합니다. '<dependentAssembly> <assemblyIdentity name = "log4net"publicKeyToken = "1b44e1d426115821"culture = "neutral"/> <bindingRedirect oldVersion = "0.0.0.0-1.2.9.0 "NEWVERSION ="1.2.10.0 "/> <코드베이스 버전 ="1.2.10.0 "HREF ="자원 \ log4net - oldkey \ log4net.dll "/> </ dependentAssembly> '
애자 제다이

27

Nuget을 통해 다운로드 한 최신 버전의 log4net을 사용하고 있습니다. 그러나 사용중인 라이브러리 중 하나에는 이전 버전이 필요합니다. 내 문제는 나를이 질문으로 이끌었다.

다른 답변의 문제는 모든 바인딩에 대해 동일한 dll 버전을 사용하고 있다는 것입니다. 레거시 종속성을 제외한 다른 모든 기능에 새 버전의 기능을 사용하고 싶습니다.

이를 수행하려면 다음을 수행해야합니다.

  1. 이전 버전 (버전 1.2.11.0) 을 다운로드 하여 시작하십시오 .
  2. 다운로드 한 바이너리의 이름을 log4net.1.2.10.dll. 빌드 작업None"최신 인 경우 복사"로 설정 하여 시작 프로젝트에 포함합니다.여기에 이미지 설명 입력
  3. .NET에서 이전 버전을 찾을 수있는 위치를 알려줍니다.

App.config

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
            <codeBase version="1.2.10.0" href="log4net.1.2.10.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

href이전 버전이 식별 속성. 따라서 log4net에 대한 다른 모든 요청은 새 버전을 가리 킵니다.


4
둘 중 하나를 참조하는 라이브러리에 대해 두 버전을 모두 유지할 수 있기 때문에 훌륭한 솔루션입니다.
SouthShoreAK

2
감사합니다! 이것은 나를 구했습니다. "출력 디렉토리로 복사"를 "복사 안함"으로 변경해야했지만 그렇지 않으면 매력처럼 작동했습니다!
Daniel Hedenström

3

이전 키로 서명 된 log4net 1.2.11.0 버전을 다운로드 할 수 있습니다. 새 키로 변경된 이유는 FAQ에 설명되어 있습니다.

http://logging.apache.org/log4net/release/faq.html#two-snks

(기본적으로 새 키는 공개적으로 사용할 수 있으며 어떤 이유로 든 배포판에 이전 키를 포함하고 싶지 않았습니다. 이전 키를 공개적으로 사용하지 않은 이유는 명확하지 않습니다.)


10
그러나 새 키에 연결된 타사 라이브러리를 사용할 때 여전히 멈춰 있습니다 (맞습니까?). 새로운 log4net을 사용하는 것은 제가 선택한 것이 아니라 타사 프레임 워크입니다. I는 점점 더 많은 프레임 워크가 새로운 키 log4net을 사용하기 시작 얼굴이 물건은 모든 사람에 날려 않을 것입니다 볼 수 없습니다
AndreasKnudsen

안타깝게도 맞습니다. 난 당신이 모든 구성 요소가 log4net ... 같은 버전의 사용 있지 않는 고려할 필요가 추측
스테판 Egli

1
.... 그러면 어떻게해야합니까? .net에이 문제를 처리하는 메커니즘이 있습니까?
AndreasKnudsen


1

특정 경우에 적합한 지 여부는 모르지만 프레임 워크 중 하나를 다시 컴파일 할 수 있으므로 동일한 공개 키로 log4net을 사용할 것입니다. 제 경우에는 log4net 1.2.10을 사용하고 combres와 log4net 1.2.11을 새 키로 사용하는 FluentNHibernate였습니다. 이전 키로 서명 한 log4net 1.2.11을 다운로드하고 Combress를 다시 컴파일했습니다. 추가 된 어셈블리 바인딩이 1.2.10에서 1.2.11로 리디렉션되고 작동이 시작됩니다.


0

이것은 모든 경우에 반드시 작동하지는 않지만 log4net을 사용하는 프로젝트가 OSS이기 때문에 소스를 다운로드하고 충돌하는 버전의 log4net을 내가 사용하고있는 버전으로 대체하고 프로젝트를 다시 빌드했습니다. 제 경우에는 Topshelf 였으므로 현재 사용중인 log4net과 동일한 버전으로 빌드 된 Topshelf 어셈블리 버전이 있으며 이제 두 가지를 문제없이 참조 할 수 있습니다.


0

위에 제공된 링크로 이동하려고했지만 Apache 사이트의 모든 링크가 작동하지 않는 것 같습니다. 그런 다음 문제를 해결하기 위해 다음을 수행했습니다.

Visual Studio에서 Nuget을 사용하여 최신 버전의 log4net (1.2.13.0)을 다운로드하고 설치합니다. NuGet 패키지 관리자는 모든 log4net (1.2.11.0)을 자동으로 다운로드하고 최신 버전으로 업그레이드합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.