런타임에서 어셈블리를 찾는 방법

업데이트: 2007년 11월

.NET Framework 응용 프로그램을 성공적으로 배포하려면 공용 언어 런타임에서 응용 프로그램을 구성하는 어셈블리를 찾아 바인딩하는 방법을 알고 있어야 합니다. 기본적으로 런타임에서는 응용 프로그램이 빌드되는 해당 버전의 어셈블리로 바인딩하려고 합니다. 구성 파일 설정으로 이 기본 동작을 재정의할 수 있습니다.

공용 언어 런타임에서는 어셈블리를 찾아 어셈블리를 참조를 확인할 때 여러 단계를 수행합니다. 각 단계는 다음 절에 설명되어 있습니다. 런타임에서 어셈블리를 찾는 방법을 설명할 때 조사라는 용어를 많이 사용합니다. 이는 어셈블리 이름과 문화권을 기반으로 어셈블리를 찾는 데 사용하는 휴리스틱 집합을 나타냅니다.

참고:

Windows SDK(소프트웨어 개발 키트)에 포함된 어셈블리 바인딩 로그 뷰어(Fuslogvw.exe)를 사용하여 로그 파일의 바인딩 정보를 볼 수 있습니다.

런타임에서 다른 어셈블리에 대한 참조를 확인하려고할 때 어셈블리를 찾아서 바인딩하는 과정이 시작됩니다. 이 참조는 정적 또는 동적 참조일 수 있습니다. 빌드 시 컴파일러는 어셈블리 매니페스트의 메타데이터에 정적 참조를 기록합니다. System.Reflection.Assembly.Load같은 여러 메서드를 호출하면 동적 참조가 신속하게 만들어집니다.

어셈블리를 참조할 때 자주 사용되는 방법은 어셈블리 이름, 버전, 문화권 및 공개 키 토큰(있는 경우)을 포함해서 전체 참조를 사용하는 것입니다. 그러면 런타임에서는 이 정보를 사용하여 이 단원 뒤에서 설명할 단계에 따라 어셈블리를 찾습니다. 참조가 정적 어셈블리 또는 동적 어셈블리에 대한 참조인지에 상관 없이 런타임에서는 같은 확인 과정을 사용합니다.

또한 어셈블리 이름만 지정하는 등, 어셈블리에 대한 부분 정보만 포함된 호출 메서드를 제공하여 어셈블리에 대한 동적 참조를 만들 수 있습니다. 이 경우 응용 프로그램 디렉터리에서만 어셈블리를 검색하며 다른 검사는 하지 않습니다. System.Reflection.Assembly.LoadSystem.AppDomain.Load 같은 어셈블리를 로드하는 다양한 메서드를 사용하여 부분 참조를 만들 수 있습니다.

System.Reflection.Assembly.Load 등의 메서드를 사용하여 동적 참조를 만들고 부분 정보만 제공할 수 있습니다. 그런 다음 응용 프로그램 구성 파일에서 <qualifyAssembly> 요소를 사용하여 참조를 한정할 수 있습니다. 이 요소를 사용하면 전체 참조 정보(이름, 버전, 문화권 및 공개 키 토큰(있는 경우))를 코드가 아닌 응용 프로그램 구성 파일에서 제공할 수 있습니다. 응용 프로그램 디렉터리 바깥에서 어셈블리에 대한 참조를 정규화하기를 원하거나, 전역 어셈블리 캐시에서 어셈블리를 참조하되 코드가 아니라 구성 파일에서 전체 참조를 지정하기를 원하는 경우 이러한 기술을 사용할 수 있습니다.

참고:

이 형식의 부분 참조는 여러 응용 프로그램이 공유하는 어셈블리에서는 사용할 수 없습니다. 구성 설정은 어셈블리 단위가 아니라 응용 프로그램 단위로 적용되므로, 이 형식의 부분 참조 형식을 사용하는 공유 어셈블리는 공유 어셈블리를 사용하는 각 응용 프로그램에서 한정 정보를 구성 파일 내에 포함할 것을 요구합니다.

런타임에서는 다음 단계를 사용하여 어셈블리 참조를 확인합니다.

  1. 응용 프로그램 구성파일, 게시자 정책파일 및 시스템 구성파일을 포함한 해당 구성파일을 검사하여구성 파일을 검토합니다. 구성 파일이 원격 시스템에 있을 경우 런타임에서는 먼저 응용 프로그램 구성 파일을 찾아 다운로드해야 합니다.

  2. 어셈블리 이름이 이전에 바인딩되었는지 여부를 확인하고 그럴 경우 이전에 로드된 어셈블리를 사용합니다. 이전에 해당 어셈블리에 대한 로드 요청이 실패한 경우에는 어셈블리를 로드하지 않고 즉시 요청이 실패하게 됩니다.

    참고:

    어셈블리 바인딩 실패를 캐시하는 기능은 .NET Framework 버전 2.0의 새로운 기능입니다.

  3. 전역 어셈블리 캐시를 검사합니다. 어셈블리가 전역 어셈블리 캐시에 있으면 런타임에서 이 어셈블리를 사용합니다.

  4. 다음 단계를 사용하여어셈블리를 찾습니다.

    1. 구성 및 게시자 정책이 원래 참조에 영향을 주지 않고 Assembly.LoadFrom 메서드를 사용하여 바인드 요청을 작성한 경우 런타임에서 위치 힌트를 확인합니다.

    2. 구성 파일에 코드베이스가 있으면 런타임은 이 위치만 확인합니다. 이 조사가 실패하면 런타임에서는 바인딩 요청이 실패했음을 확인하고 다른 조사를 수행하지 않습니다.

    3. 찾기 단원에서 설명한 휴리스틱을 사용하여 어셈블리를 조사합니다. 조사 후에 어셈블리를 찾지 못하면 런타임에서는 어셈블리를 제공하도록 Windows Installer에 요청합니다. 이것은 필요 시 설치 기능과 같은 역할을 합니다.

      참고:

      강력한 이름이 없는 어셈블리에 대해서는 버전 확인을 하지 않으며, 강력한 이름이 없는 어셈블리의 전역 어셈블리 캐시를 런타임에서 체크 인하지도 않습니다.

커뮤니티 추가 항목

표시: