메모
이 문서는 .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");
}
}
}
참고하십시오
.NET