다음을 통해 공유


loadFromContext MDA

참고 항목

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

loadFromContext MDA(관리 디버깅 도우미)는 어셈블리가 LoadFrom 컨텍스트에 로드되면 활성화됩니다. 이 상황은 Assembly.LoadFrom을 호출하거나 비슷한 메서드를 호출한 결과 발생할 수 있습니다.

증상

일부 로더 메서드를 사용하면 어셈블리가 LoadFrom 컨텍스트에 로드될 수 있습니다. 이 컨텍스트를 사용하면 예기치 않은 serialization, 캐스팅 및 종속성 확인 동작이 발생할 수 있습니다. 일반적으로 이러한 문제점을 방지하기 위해 어셈블리를 Load 컨텍스트에 로드하는 것이 좋습니다. 이 MDA 없으면 어셈블리가 로드된 컨텍스트를 판별하기가 어렵습니다.

원인

일반적으로 Load 컨텍스트 외부의 경로에서 로드된 경우(예: 전역 어셈블리 캐시 또는 AppDomainSetup.ApplicationBase 속성) 어셈블리가 LoadFrom 컨텍스트에 로드됩니다.

해결

더 이상 LoadFrom을 호출하지 않아도 되도록 애플리케이션을 구성합니다. 이 작업을 수행할 때 다음 기술을 사용할 수 있습니다.

  • 전역 어셈블리 캐시에 어셈블리 설치

  • AppDomainApplicationBase 디렉터리에 어셈블리를 둡니다. 기본 도메인의 경우 ApplicationBase 디렉터리에 프로세스를 시작하는 실행 파일이 포함되어 있습니다. 어셈블리를 쉽게 이동할 수 없는 경우 새로운 AppDomain을 만들어야 할 수도 있습니다.

  • 종속 어셈블리가 실행 파일과 관련된 하위 디렉터리에 있는 경우 보조 애플리케이션 도메인 또는 애플리케이션 구성(.config) 파일에 검색 경로를 추가합니다.

각각의 경우 Assembly.Load 메서드를 사용하도록 코드를 변경할 수 있습니다.

런타임에 대한 영향

MDA는 CLR에 영향을 미치지 않습니다. 로드 요청 결과로 사용된 컨텍스트를 보고합니다.

출력

MDA는 어셈블리가 LoadFrom 컨텍스트에 로드되었음을 보고합니다. 어셈블리의 단순한 이름과 경로를 지정합니다. LoadFrom 컨텍스트를 사용하지 못하게 완화하도록 제안합니다.

구성

<mdaConfig>
  <assistants>
    <loadFromContext />
  </assistants>
</mdaConfig>

예시

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

using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // The following call caused the LoadFrom context to be used
            // because the assembly is loaded using LoadFrom and the path is
            // located outside of the Load context probing path.
            Assembly.LoadFrom(@"C:\Text\Test.dll");
        }
    }
}

참고 항목