어셈블리 바인딩 리디렉션 : 방법 및 이유


127

이것은 문제가되는 질문이 아니라 어셈블리 바인딩 리디렉션의 작동에 대한 일반적인 이해 질문입니다.

쿼리

  1. 바인딩 리디렉션이 부, 빌드 및 개정 번호가 아닌 주 버전 만 표시하는 이유는 무엇입니까?
  2. 메이저 버전이 변경된 경우에만 이전 버전과 새 버전이 변경 되나요?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

주요 버전뿐만 아니라 모든 버전이 될 수 있습니다. 예 :oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk : 내가 본 모든 예제는 메이저 버전 만 보여줍니다.
Nikhil Agrawal

4
그것들은 단지 예일 뿐이며 그것이 가능한 유일한 방법이라고 언급 된 곳은 없습니다.
Evk

답변:


166

바인딩 리디렉션이 필요한 이유는 무엇입니까? 라이브러리 B를 참조하는 애플리케이션 A와 버전 1.1.2.5의 라이브러리 C가 있다고 가정합니다. 라이브러리 B는 라이브러리 C도 참조하지만 버전 1.1.1.0입니다. 런타임에 동일한 어셈블리의 다른 버전을로드 할 수 없기 때문에 이제 충돌이 발생합니다. 이 충돌을 해결하려면 일반적으로 새 버전으로 바인딩 리디렉션을 사용할 수 있습니다 (그러나 이전 버전도 가능). configuration > runtime > assemblyBinding섹션 아래에있는 애플리케이션 A의 app.config 파일에 다음을 추가하면됩니다 ( 전체 구성 파일의 예는 여기 참조 ).

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

매핑 할 다양한 버전을 지정할 수도 있습니다.

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

이제 버전 1.1.1.0의 C를 참조하여 컴파일 된 라이브러리 B는 런타임에 버전 1.1.2.5의 C를 사용합니다. 물론 라이브러리 C가 이전 버전과 호환되는지 확인하는 것이 좋습니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다.

주요 라이브러리뿐만 아니라 모든 버전의 라이브러리를 리디렉션 할 수 있습니다.


어떤 파일과 어떤 섹션으로 들어가나요? 누군가 참조를 위해 MSDN 또는 유사한 소스에 대한 링크를 제공 할 수 있습니까? 사람들은 검색 엔진 영역 전체에서 SO Q / A 기사에 방문 할 것이며 참조는 중요합니다. 나는 일주일 동안 휴가를 떠나기 직전에 동료가 "그냥 exe 파일에 어셈블리 리디렉션을 추가"하라고 말했고 여기에 도착했는데이 답변은 훌륭해 보이지만 컨텍스트와 참조가 부족합니다.
tpartee

유효한 질문 @tpartee, 구성 섹션 및 docs.microsoft.com/en-us/dotnet/framework/configure-apps/…에
Kobus Smit

1
@AlexanderDerck 응용 프로그램 A의 구성 파일-라이브러리 구성 파일에 영향을주지 않습니다 (내가 아는 한).이 라이브러리가 단위 테스트 라이브러리이고 어떤 의미에서 단위 테스트 실행기에 의해 "실행"되는 경우를 제외하고는 예외입니다.
Evk

1
@AlexanderDerck 몇 주 전에 많은 찬성 투표와 현상금이 포함 된 질문이 있었는데,이 질문은 정확히 질문했지만 아무도 설득력있는 답변을 제공 할 수 없었습니다.- stackoverflow.com
q

1
@CodeEngine publicKeyToken은 어셈블리 C를 식별합니다. 서명 된 어셈블리에만 해당 어셈블리를 식별하는 공개 키 토큰이 있습니다. 다음은 어셈블리가있는 경우 해당 토큰을 찾는 방법에 대한 관련 질문입니다. stackoverflow.com/q/3045033/5311735
Evk

56

NewtonSoft.Json에 대한 바인딩 리디렉션 문제를 발견했습니다. 우리는 win 10 파일 속성 "9.0.1.19813"에서 파일 버전을 찾고 번호를 찾고 리디렉션이 계속 실패했습니다. 추가 조사 결과 어셈블리 버전이 아닌 파일 버전을보고 있음을 발견했습니다. 그래서 사람들이 파일 버전 (자주 변경됨)과 어셈블리 버전 (Windows 10 파일 탐색기에서 볼 수 없음)을 잘못 착각하고 있는지 궁금합니다. dll의 어셈블리 버전을 보려면 powershell에서 실행할 수 있습니다. dll 이름을 버전을 찾으려는 이름으로 바꿉니다.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

위의 결과입니다.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

참조 참조 :

Windows Vista 이상 (WIndows 7, 2008)에서 .NET 어셈블리의 어셈블리 버전을 어떻게 볼 수 있습니까?

https://support.microsoft.com/en-nz/help/556041

여기에 이미지 설명 입력


12
파일 버전과 어셈블리 버전의 차이를 올려주세요 !!
mrid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.