메모
이 문서는 .NET Framework에만 적용됩니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.
컴파일 시간 바인딩 참조를 .NET Framework 어셈블리, 타사 어셈블리 또는 자체 앱의 어셈블리로 리디렉션할 수 있습니다. 게시자 정책, 앱 구성 파일 또는 컴퓨터 구성 파일을 통해 다양한 방법으로 다른 버전의 어셈블리를 사용하도록 앱을 리디렉션할 수 있습니다. 이 문서에서는 .NET Framework에서 어셈블리 바인딩이 작동하는 방식과 구성 방법에 대해 설명합니다.
어셈블리 통합 및 기본 바인딩
.NET Framework 어셈블리에 대한 바인딩은 때때로 어셈블리 통합호출되는 프로세스를 통해 리디렉션됩니다. .NET Framework는 공용 언어 런타임 버전과 형식 라이브러리를 구성하는 약 22개의 .NET Framework 어셈블리로 구성됩니다. 이러한 .NET Framework 어셈블리는 런타임에서 단일 단위로 처리됩니다. 기본적으로 앱이 시작되면 런타임에서 실행하는 코드 형식에 대한 모든 참조는 프로세스에 로드된 런타임과 버전 번호가 동일한 .NET Framework 어셈블리로 전달됩니다. 이 모델에서 발생하는 리디렉션은 런타임에 대한 기본 동작입니다.
예를 들어 앱이 System.XML 네임스페이스의 형식을 참조하고 .NET Framework 4.5를 사용하여 빌드된 경우 런타임 버전 4.5와 함께 제공되는 System.XML 어셈블리에 대한 정적 참조가 포함됩니다. .NET Framework 4와 함께 제공되는 System.XML 어셈블리를 가리키도록 바인딩 참조를 리디렉션하려는 경우 앱 구성 파일에 리디렉션 정보를 넣을 수 있습니다. 통합 .NET Framework 어셈블리에 대한 구성 파일의 바인딩 리디렉션은 해당 어셈블리에 대한 통합을 취소합니다.
또한 사용 가능한 버전이 여러 개 있는 경우 타사 어셈블리에 대한 어셈블리 바인딩을 수동으로 리디렉션할 수 있습니다.
팁
애플리케이션이 간접적으로 참조하는 NuGet 패키지를 업데이트하고 FileLoadException
, MissingMethodException
, TypeLoadException
또는 FileNotFoundException
같은 새 오류가 표시되도록 시작하는 경우 자동 바인딩 리디렉션을 사용하도록 설정하거나 바인딩 리디렉션을 수동으로 추가해야 할 수 있습니다. 이는 NuGet 패키지를 업데이트할 때 정상이며 일부 패키지가 이전 버전의 종속성에 대해 빌드된 결과입니다. 다음 앱 구성 파일 발췌에서는 System.Memory 패키지대한 바인딩 리디렉션을 추가합니다.
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
게시자 정책을 사용하여 버전 리디렉션
어셈블리 공급업체는 새 어셈블리에 게시자 정책 파일을 포함하여 앱을 최신 버전의 어셈블리로 보낼 수 있습니다. 전역 어셈블리 캐시에 있는 게시자 정책 파일에는 어셈블리 리디렉션 설정이 포함되어 있습니다.
각 주요및부차적 버전의 어셈블리에는 자체 게시자 정책 파일이 있습니다. 예를 들어 버전 2.0.2.222에서 2.0.3.000 및 버전 2.0.2.321에서 버전 2.0.3.000으로의 리디렉션은 모두 버전 2.0과 연결되어 있으므로 동일한 파일로 이동합니다. 그러나 버전 3.0.0.999에서 버전 4.0.0.000으로의 리디렉션은 버전 3.0.999의 파일로 이동합니다. .NET Framework의 각 주 버전에는 자체 게시자 정책 파일이 있습니다.
어셈블리에 대한 게시자 정책 파일이 있는 경우 런타임은 어셈블리의 매니페스트 및 앱 구성 파일을 확인한 후 이 파일을 확인합니다. 공급업체는 새 어셈블리가 리디렉션되는 어셈블리와 하위 호환되는 경우에만 게시자 정책 파일을 사용해야 합니다.
바이패스 게시자 정책 섹션에서 설명한 대로 앱 구성 파일에서 설정을 지정하여 앱에 대한 게시자 정책을 무시할 수 있습니다.
앱 수준에서 버전 리디렉션
앱 구성 파일을 통해 앱에 대한 바인딩 동작을 변경하는 몇 가지 방법이 있습니다. 파일 수동으로 편집할, 자동 바인딩 리디렉션 의존하거나, 게시자 정책 무시하지바인딩 동작을 지정할 수 있습니다.
앱 구성 파일을 수동으로 편집
어셈블리 문제를 해결하기 위해 앱 구성 파일을 수동으로 편집할 수 있습니다. 예를 들어 공급업체가 게시자 정책을 제공하지 않고 앱에서 사용하는 최신 버전의 어셈블리를 릴리스하는 경우(이전 버전과의 호환성을 보장하지 않기 때문에) 다음과 같이 앱의 구성 파일에 어셈블리 바인딩 정보를 배치하여 앱에 최신 버전의 어셈블리를 사용하도록 지시할 수 있습니다.
<dependentAssembly>
<assemblyIdentity name="someAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
자동 바인딩 리디렉션에 의존
Visual Studio에서 .NET Framework 4.5.1 이상을 대상으로 하는 데스크톱 앱을 만들 때 앱은 자동 바인딩 리디렉션을 사용합니다. 즉, 두 구성 요소가 동일한 강력한 이름의 어셈블리의 다른 버전을 참조하는 경우 런타임은 출력 앱 구성(app.config) 파일의 최신 버전의 어셈블리에 바인딩 리디렉션을 자동으로 추가합니다. 이 리디렉션은 그렇지 않은 경우 발생할 수 있는 어셈블리 통합을 무시합니다. 원본 app.config 파일이 수정되지 않았습니다. 예를 들어 앱이 대역 외 .NET Framework 구성 요소를 직접 참조하지만 동일한 구성 요소의 이전 버전을 대상으로 하는 타사 라이브러리를 사용한다고 가정해 보겠습니다. 앱을 컴파일하면 출력 앱 구성 파일이 최신 버전의 구성 요소로의 바인딩 리디렉션을 포함하도록 수정됩니다.
웹앱을 만드는 경우 바인딩 충돌과 관련된 빌드 경고가 표시되며, 그러면 원본 웹 구성 파일에 필요한 바인딩 리디렉션을 추가할 수 있는 옵션이 제공됩니다.
원본 app.config 파일에 바인딩 리디렉션을 수동으로 추가하는 경우 컴파일 시 Visual Studio는 추가한 바인딩 리디렉션에 따라 어셈블리를 통합하려고 시도합니다. 예를 들어 어셈블리에 대해 다음 바인딩 리디렉션을 삽입한다고 가정해 보겠습니다.
<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0" />
앱의 다른 프로젝트가 동일한 어셈블리의 버전 1.0.0.0을 참조하는 경우 자동 바인딩 리디렉션은 이 어셈블리의 버전 2.0.0.0에서 앱이 통합되도록 출력 app.config 파일에 다음 항목을 추가합니다.
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
앱이 이전 버전의 .NET Framework를 대상으로 하는 경우 자동 바인딩 리디렉션을 사용하도록 설정할 수 있습니다. 모든 어셈블리에 대한 app.config 파일에 바인딩 리디렉션 정보를 제공하거나 바인딩 리디렉션 기능을 해제하여 이 기본 동작을 재정의할 수 있습니다. 이 기능을 켜거나 끄는 방법에 대한 자세한 내용은 방법: 자동 바인딩 리디렉션사용 및 비활성화를 참조하세요.
게시자 정책 무시
필요한 경우 앱 구성 파일에서 게시자 정책을 재정의할 수 있습니다. 예를 들어 이전 버전과 호환한다고 주장하는 새 버전의 어셈블리는 여전히 앱을 중단할 수 있습니다. 게시자 정책을 우회하려면 앱 구성 파일의 <dependentAssembly> 요소에 <publisherPolicy> 요소를 추가하고, 이전 apply
설정을 재정의하도록 no
특성을 yes
로 설정합니다.
<publisherPolicy apply="no" />
게시자 정책을 우회하여 사용자를 위해 앱을 계속 실행하지만 어셈블리 공급업체에 문제를 보고해야 합니다. 어셈블리에 게시자 정책 파일이 있는 경우 공급업체는 어셈블리가 이전 버전과 호환되고 클라이언트가 새 버전을 최대한 많이 사용할 수 있는지 확인해야 합니다.
다른 구성 요소에서 사용하는 테스트, 플러그 인 또는 라이브러리의 버전 리디렉션
테스트의 경우 .dll.config 파일을 생성해야 합니다. 대부분의 기존 단위 테스트 프레임워크는 테스트를 로드할 때 이러한 파일을 적용합니다.
플러그 인은 .dll.config 파일을 적용할 수 있지만 그렇지 않을 수도 있습니다. 리디렉션에 대해 확실한 유일한 메커니즘은 bindingRedirects
을 만들 때 AppDomain을 제공하는 것입니다.
AssemblyResolve 이벤트 처리기에서 이 문제를 해결하려고 시도할 수 있지만 해당 처리기는 실패한 로드에서만 호출되므로 작동하지 않습니다. 어셈블리 로드가 다른 어셈블리 또는 호스트에 의해 로드되었거나 GAC에 있었기 때문에 어셈블리 로드가 성공하면 AssemblyResolve
처리기가 호출되지 않습니다.
컴퓨터 수준에서 버전 리디렉션
컴퓨터 관리자가 컴퓨터의 모든 앱이 특정 버전의 어셈블리를 사용하도록 하려는 경우는 드물 수 있습니다. 예를 들어 특정 버전이 보안 허점을 수정할 수 있습니다. 어셈블리가 컴퓨터의 구성 파일(machine.config)에서 리디렉션되는 경우 이전 버전을 사용하는 해당 컴퓨터의 모든 앱은 새 버전을 사용하도록 지시됩니다. 컴퓨터 구성 파일은 앱 구성 파일 및 게시자 정책 파일을 재정의합니다. 이 machine.config 파일은 32비트 컴퓨터의 %windir%\Microsoft.NET\Framework[version]\config\machine.config 또는 64비트 컴퓨터의 경우 %windir%\Microsoft.NET\Framework64[version]\config\machine.config 있습니다.
구성 파일에서 어셈블리 바인딩 지정
동일한 XML 형식을 사용하여 앱 구성 파일, 컴퓨터 구성 파일 또는 게시자 정책 파일에 있는지 여부에 관계없이 바인딩 리디렉션을 지정합니다. 한 어셈블리 버전을 다른 어셈블리 버전으로 리디렉션하려면 <bindingRedirect> 요소를 사용합니다.
oldVersion
특성은 단일 어셈블리 버전 또는 버전 범위를 지정할 수 있습니다.
newVersion
특성은 단일 버전을 지정해야 합니다. 예를 들어 <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/>
런타임에서 1.1.0.0과 1.2.0.0 사이의 어셈블리 버전 대신 버전 2.0.0.0을 사용하도록 지정합니다.
다음 코드 예제에서는 다양한 바인딩 리디렉션 시나리오를 보여 줍니다. 이 예제에서는 myAssembly
버전 범위에 대한 리디렉션과 mySecondAssembly
대한 단일 바인딩 리디렉션을 지정합니다. 또한 이 예제에서는 게시자 정책 파일이 myThirdAssembly
대한 바인딩 리디렉션을 재정의하지 않도록 지정합니다.
어셈블리를 바인딩하려면 "urn:schemas-microsoft-com:asm.v1" 문자열을 xmlns
태그의 < 특성으로 지정해야 합니다.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Assembly versions can be redirected in app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="mySecondAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="myThirdAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Publisher policy can be set only in the app
configuration file. -->
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
어셈블리 바인딩을 특정 버전으로 제한
앱 구성 파일의 appliesTo
요소에서 < 특성을 사용하여 어셈블리 바인딩 참조를 특정 버전의 .NET Framework로 리디렉션할 수 있습니다. 이 선택적 특성은 .NET Framework 버전 번호를 사용하여 적용되는 버전을 나타냅니다.
appliesTo
특성을 지정하지 않으면 <assemblyBinding> 요소가 모든 버전의 .NET Framework에 적용됩니다.
예를 들어 .NET Framework 3.5 어셈블리에 대한 어셈블리 바인딩을 리디렉션하려면 앱 구성 파일에 다음 XML 코드를 포함해야 합니다.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
appliesTo="v3.5">
<dependentAssembly>
<!-- assembly information goes here -->
</dependentAssembly>
</assemblyBinding>
</runtime>
버전 순서대로 리디렉션 정보를 입력해야 합니다. 예를 들어 .NET Framework 3.5 어셈블리와 .NET Framework 4.5 어셈블리에 대한 어셈블리 바인딩 리디렉션 정보를 입력합니다. 마지막으로 appliesTo
특성을 사용하지 않으므로 모든 버전의 .NET Framework에 적용되는 .NET Framework 어셈블리 리디렉션에 대한 어셈블리 바인딩 리디렉션 정보를 입력합니다. 리디렉션에 충돌이 있는 경우 구성 파일에서 일치하는 첫 번째 리디렉션 문이 사용됩니다.
예를 들어 한 참조를 .NET Framework 3.5 어셈블리로 리디렉션하고 다른 참조를 .NET Framework 4 어셈블리로 리디렉션하려면 다음 의사 코드에 표시된 패턴을 사용합니다.
<assemblyBinding xmlns="..." appliesTo="v3.5 ">
<!--.NET Framework version 3.5 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="..." appliesTo="v4.0.30319">
<!--.NET Framework version 4.0 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="...">
<!-- redirects meant for all versions of the runtime -->
</assemblyBinding>
또한 참조하십시오
.NET