기본 검색

AssemblyLoadContext.Default 인스턴스는 어셈블리의 종속성을 찾는 역할을 합니다. 이 문서에서는 AssemblyLoadContext.Default 인스턴스의 검색 논리를 설명합니다.

호스트 구성 검색 속성

런타임이 시작되면 런타임 호스트는 AssemblyLoadContext.Default 프로브 경로를 구성하는 명명된 검색 속성 세트를 제공합니다.

각 검색 속성은 선택 사항입니다. 있는 경우 각 속성은 구분 기호로 분리된 절대 경로 목록을 포함하는 문자열 값입니다. 구분 기호는 Windows의 경우 ';'이고 다른 모든 플랫폼의 경우 ':'입니다.

속성 이름 설명
TRUSTED_PLATFORM_ASSEMBLIES 플랫폼 및 애플리케이션 어셈블리 파일 경로의 목록입니다.
PLATFORM_RESOURCE_ROOTS 위성 리소스 어셈블리를 검색할 디렉터리 경로 목록입니다.
NATIVE_DLL_SEARCH_DIRECTORIES 관리되지 않는(네이티브) 라이브러리를 검색할 디렉터리 경로 목록입니다.
APP_PATHS 관리 어셈블리를 검색할 디렉터리 경로 목록입니다.

속성이 채워지는 방법

<myapp>.deps.json 파일의 존재 여부에 따라 속성을 채우는 두 가지 주요 시나리오가 있습니다.

  • *.deps.json 파일이 있으면 검색 속성을 채우도록 구문 분석됩니다.
  • *.deps.json 파일이 없으면 애플리케이션의 디렉터리에 모든 종속성이 포함된 것으로 가정합니다. 디렉터리의 콘텐츠는 검색 속성을 채우는 데 사용됩니다.

또한 참조된 프레임워크의 *.deps.json 파일도 유사하게 구문 분석됩니다.

환경 변수 DOTNET_ADDITIONAL_DEPS를 사용하여 추가 종속성을 추가할 수 있습니다. dotnet.exe에는 애플리케이션을 시작할 때 이 값을 설정하는 선택적 매개 변수 --additional-deps도 포함되어 있습니다.

APP_PATHS 속성은 기본적으로 채워지지 않으며 대부분의 애플리케이션에서 생략됩니다.

애플리케이션에서 사용되는 모든 *.deps.json 파일 목록은 System.AppContext.GetData("APP_CONTEXT_DEPS_FILES")를 통해 액세스할 수 있습니다.

관리 코드에서 검색 속성을 확인하는 방법

각 속성은 위의 표에서 속성 이름으로 AppContext.GetData(String) 함수를 호출하여 사용할 수 있습니다.

검색 속성 생성의 구성을 디버깅하는 방법

특정 환경 변수가 활성화되면 .NET Core 런타임 호스트가 유용한 추적 메시지를 출력합니다.

환경 변수 설명
COREHOST_TRACE=1 추적을 활성화합니다.
COREHOST_TRACEFILE=<path> 기본 stderr 대신 파일 경로를 추적합니다.
COREHOST_TRACE_VERBOSITY 자세한 정도를 1(가장 낮음)에서 4(가장 높음)로 설정합니다.

관리 어셈블리 기본 검색

관리 어셈블리를 찾기 위해 검색할 때 AssemblyLoadContext.Default은 다음을 순서대로 검색합니다.

  • 파일 확장명을 제거한 후 TRUSTED_PLATFORM_ASSEMBLIES에서 AssemblyName.Name과 일치하는 파일입니다.
  • 일반 파일 확장자가 있는 APP_PATHS의 어셈블리 파일입니다.

위성(리소스) 어셈블리 검색

특정 문화권에 대한 위성 어셈블리를 찾으려면 파일 경로 세트를 구성합니다.

PLATFORM_RESOURCE_ROOTSAPP_PATHS의 각 경로에 대해 CultureInfo.Name 문자열, 디렉터리 구분 기호, AssemblyName.Name 문자열 및 확장명 '.dll'을 추가합니다.

일치하는 파일이 있는 경우 로드하고 반환합니다.

관리되지 않는(네이티브) 라이브러리 검색

런타임의 관리되지 않는 라이브러리 프로빙 알고리즘은 모든 플랫폼에서 동일합니다. 그러나 관리되지 않는 라이브러리의 실제 로드는 기본 플랫폼에 의해 수행되므로 관찰된 동작이 약간 다를 수 있습니다.

  1. 제공된 라이브러리 이름이 절대 경로 또는 상대 경로를 나타내는지 확인합니다.

  2. 이름이 절대 경로를 나타내는 경우 모든 후속 작업에 해당 이름을 직접 사용합니다. 그렇지 않으면 이름을 사용하고 고려할 플랫폼 정의 조합을 만듭니다. 조합은 플랫폼별 접두사(예: lib) 및/또는 접미사(예: .dll, .dylib.so)로 구성됩니다. 이는 완전한 목록이 아니며 각 플랫폼에서 수행된 정확한 활동을 나타내지 않습니다. 이는 고려 사항의 예일 뿐입니다. 자세한 내용은 네이티브 라이브러리 로드를 참조하세요.

  3. 이름과 경로가 상대적인 경우 각 조합은 다음 단계에서 사용됩니다. 첫 번째 성공적인 로드 시도는 즉시 로드된 라이브러리에 핸들을 반환합니다.

    • NATIVE_DLL_SEARCH_DIRECTORIES 속성에 제공된 각 경로에 이를 추가하고 로드를 시도합니다.

    • DefaultDllImportSearchPathsAttribute가 호출 어셈블리 또는 p/invoke에 정의되지 않았거나 정의되어 DllImportSearchPath.AssemblyDirectory를 포함하는 경우 호출 어셈블리 디렉터리에 이름이나 조합을 추가하고 로드를 시도합니다.

    • 라이브러리를 로드하려면 직접 사용합니다.

  4. 라이브러리를 로드하지 못했음을 나타냅니다.