2010-02-03 2 views
41

공개 키 토큰이 이전 버전에서 null이고 최신 버전으로 설정된 경우 참조 된 어셈블리의 다른 버전간에 어셈블리 바인딩 리디렉션을 수행 할 수 있습니까?다른 공개 키 토큰을 사용하는 .NET 어셈블리 바인딩 리디렉션

예를 들어, I는 두 어셈블리 ...

중립 System.Web.Mvc 버전 1.0.0.0 = 문화 = PublicKeyToken = NULL

System.Web있다. MVC, 버전 = 2.0.0.0, 문화 = 중립, PublicKeyToken = 31bf3856ad364e35

해야 Asp.Net web.config 파일에서 다음 어셈블리 바인딩 리디렉션 작업 ...

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

답변

33

아니요, 불가능합니다. 어셈블리에는 동일한 publicKeyToken이 있어야합니다.

bindingRedirect 태그에는 oldVersion 및 newVersion 속성 만 있으므로 "null"버전에 대해서는 알 수 없습니다.

5

AppDomain.AssemblyResolve 이벤트를 사용하여이를 수행 할 수 있습니다. this answer에 몇 가지 샘플 코드를 포함 시켰습니다.

+2

는 슬프게도, 공개 키 토큰이 아직 일치해야합니다 보인다. 다른 어셈블리를 수동으로로드하려고하면 ("bindingRedirect"또는 "without"), "찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다." – ladenedge

+0

@ladenedge, 내가 링크 된 답변의 샘플 코드를 보면 사용할 어셈블리를 결정할 기준을 사용할 수 있습니다. 샘플에서 어셈블리 이름을 사용하고 공용 키 토큰을 무시했습니다. 필자의 샘플은 실행시가 아니라 파일에서 어셈블리를 동적으로로드하는 것입니다. 공정하기 위해서, 나는 당신이 말하는 것을하려고하지 않았기 때문에 불가능할 수도 있습니다. –

1

바인딩 리디렉션을 사용할 수 없습니다 보인다,하지만 내 경우에는 내가 참조하는 DLL에서 요구되는 토큰 값을 개정하여 publicKeyTokens 각기 다른 문제를 해결하기 위해 관리 않았다

dll을 일리노이로 분해하고, 참조를 변경하고, 재조합 (그리고 재 서명 - 키 파일이없는 경우 문제 일 수 있음).

(when referencing assemblies, is it possible to insist on a version number but ignore the publickeytoken? (ie accept signed/unsigned)에 내 의견을 참조)

관련 문제