log4net 1.2.10.0을 참조하는 NHibernate 2.1.2.400을 사용하고 있습니다. 같은 프로젝트에서 나는 또한 단순한 회계 SDK를 사용하는데, 슬프게도 여전히 log4net 1.2.9.0을 사용하고 있습니다.
따라서 log4net 1.2.10.0을 참조하면 NHibernate가 작동하도록 할 수 있지만 simplySDK가 작동하지 않습니다. 그 반대…
대부분의 문제는 log4net이 어셈블리 키를 변경했다는 사실에서 비롯된 것 같습니다. 성공하지 않고 바인딩 리디렉션을 사용해 보았습니다. 2 개의 DLL에 동일한 키가 없습니다.
나는 NHibernate를 다시 컴파일하여 log4net 1.2.9.0을 사용하는 것을 고려하고 있지만 잘못된 일처럼 보이며 Simply Accounting이 언제든지 log4net 1.2.10.0을 사용하도록 SDK를 업데이트하지 않을 것이라고 생각합니다.
이를 처리하는 가장 좋은 방법은 무엇입니까? 전혀 해결할 수 있습니까?
답변
비슷한 질문에 대한 답변을 사용하여 해결책을 찾았습니다.
프로젝트에 log4net의 각 버전에 대해 하나씩 2 개의 폴더를 만듭니다. 솔루션에 파일을 추가하여 각 log4net.dll을 해당 폴더에 배치합니다 (참조 추가가 아님). 출력 디렉터리로 복사 속성을 항상 복사하도록 설정하여 빌드 할 때 출력 폴더에 자동으로 복사되도록 할 수 있습니다.
그런 다음 다음과 같이 추가하여 app.config 파일을 수정합니다.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="681549d62126b7b8" />
<codeBase version="1.2.9.0" href="log4netv1.2.9.0\log4net.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
<codeBase version="1.2.10.0" href="log4netv1.2.10.0\log4net.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
<codeBase version="1.2.11.0" href="log4net.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
sn -T [assemblyName]을 사용하여 어셈블리의 공개 키 토큰을 얻을 수 있습니다.
답변
레지스트리에 제외를 추가 할 수 있습니다. 다음 키를 추가하십시오.
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,681549d62126b7b8
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,1b44e1d426115821
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,669e0ddf0bb1aa2a
이렇게하면 .net 런타임이 나열된 어셈블리에 대한 유효성 검사를 건너 뜁니다. 이론적으로 이것은 보안 문제이지만 어쨌든 비공개 키가 공개되어 있기 때문에 거의 영향을 미치지 않습니다.
답변
바인딩 리디렉션이 작동하지 않고 단순히 회계 SDK가 폐쇄 된 소스 인 경우 가능한 솔루션은 NHibernate를 다시 컴파일하여 log4net 1.2.9.0을 사용하는 것입니다.