다음을 통해 공유


bindingFailure MDA

메모

이 문서는 .NET Framework와 관련이 있습니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.

bindingFailure 어셈블리를 로드하지 못하면 MDA(관리 디버깅 도우미)가 활성화됩니다.

Symptoms

코드에서 정적 참조 또는 로더 메서드 중 하나를 사용하여 어셈블리를 로드하려고 했습니다(예: Assembly.Load 또는 Assembly.LoadFrom.). 어셈블리가 로드되지 않고 예외가 FileNotFoundExceptionFileLoadException throw됩니다.

원인

런타임에서 어셈블리를 로드할 수 없는 경우 바인딩 오류가 발생합니다. 바인딩 실패는 다음 상황 중 하나의 결과일 수 있습니다.

  • CLR(공용 언어 런타임)에서 요청된 어셈블리를 찾을 수 없습니다. 어셈블리가 설치되지 않거나 애플리케이션이 어셈블리를 찾도록 올바르게 구성되지 않는 등 여러 가지 이유가 발생할 수 있습니다.

  • 일반적인 문제 시나리오는 다른 애플리케이션 도메인에 형식을 전달하는 것입니다. 이 경우 CLR이 다른 애플리케이션 도메인에 해당 형식을 포함하는 어셈블리를 로드해야 합니다. 다른 애플리케이션 도메인이 원래 애플리케이션 도메인과 다르게 구성된 경우 런타임에서 어셈블리를 로드하지 못할 수 있습니다. 예를 들어 두 애플리케이션 도메인에는 서로 다른 BaseDirectory 속성 값이 있을 수 있습니다.

  • 요청된 어셈블리가 손상되었거나 어셈블리가 아닙니다.

  • 어셈블리를 로드하려는 코드에는 어셈블리를 로드할 수 있는 올바른 코드 액세스 보안 권한이 없습니다.

  • 사용자 자격 증명은 파일을 읽는 데 필요한 권한을 제공하지 않습니다.

해결 방법

첫 번째 단계는 CLR이 요청된 어셈블리에 바인딩할 수 없는 이유를 확인하는 것입니다. 원인 섹션에 나열된 시나리오와 같이 런타임이 요청된 어셈블리를 찾거나 로드할 수 없는 이유는 여러 가지가 있습니다. 바인딩 실패의 원인을 제거하려면 다음 작업을 수행하는 것이 좋습니다.

  • MDA에서 제공하는 bindingFailure 데이터를 사용하여 원인을 확인합니다.

    • Fuslogvw.exe(어셈블리 바인딩 로그 뷰어)를 실행하여 어셈블리 바인더에서 생성된 오류 로그를 읽습니다.

    • 어셈블리가 요청된 위치에 있는지 확인합니다. 및 LoadFile 메서드의 LoadFrom 경우 요청된 위치를 쉽게 확인할 수 있습니다. 어셈블리 ID를 Load 사용하여 바인딩하는 메서드의 경우 애플리케이션 도메인의 BaseDirectory 속성 프로브 경로 및 전역 어셈블리 캐시에서 해당 ID와 일치하는 어셈블리를 찾아야 합니다.

  • 이전 결정에 따라 원인을 해결합니다. 가능한 해결 옵션은 다음과 같습니다.

    • 전역 어셈블리 캐시에 요청된 어셈블리를 설치하고 호출합니다. Load 메서드를 사용하여 ID별로 어셈블리를 로드합니다.

    • 요청된 어셈블리를 애플리케이션 디렉터리에 복사하고 메서드를 Load 호출하여 ID별로 어셈블리를 로드합니다.

    • 속성을 변경 BaseDirectory 하거나 프라이빗 검색 경로를 추가하여 어셈블리 경로를 포함하도록 바인딩 오류가 발생한 애플리케이션 도메인을 다시 구성합니다.

    • 로그온한 사용자가 파일을 읽을 수 있도록 파일의 액세스 제어 목록을 변경합니다.

런타임에 미치는 영향

이 MDA는 CLR에 영향을 주지 않습니다. 바인딩 실패에 대한 데이터만 보고합니다.

출력

MDA는 요청된 경로 및/또는 표시 이름, 바인딩 컨텍스트, 로드가 요청된 애플리케이션 도메인 및 실패 이유를 포함하여 로드에 실패한 어셈블리를 보고합니다.

CLR에서 해당 데이터를 사용할 수 없는 경우 표시 이름 또는 요청된 경로가 비어 있을 수 있습니다. 실패한 호출이 메서드에 Load 대한 호출인 경우 런타임에서 어셈블리의 표시 이름을 확인할 수 없을 수 있습니다.

Configuration

<mdaConfig>
  <assistants>
    <bindingFailure />
  </assistants>
</mdaConfig>

예시

다음 코드 예제에서는 이 MDA를 활성화할 수 있는 상황을 보여 줍니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // This call attempts to load a nonexistent assembly.
            // The call will throw a System.IO.FileNotFound exception
            // and cause the activation of the bindingFailure MDA
            // if it is registered.
            Assembly.Load("NonExistentAssembly");
        }
    }
}

참고하십시오