다음을 통해 공유


단일 파일 앱은 더 이상 실행 파일 디렉터리에서 네이티브 라이브러리를 찾지 않습니다.

이전에는 단일 파일 .NET 애플리케이션에서 단일 파일 실행 파일의 디렉터리가 시작 중에 속성에 NATIVE_DLL_SEARCH_DIRECTORIES 추가되었습니다. 따라서 관리되지 않는 라이브러리 가 로드될 때 .NET은 항상 애플리케이션 디렉터리를 검색했습니다. NativeAOTrpath가 있는 Windows가 아닌 경우 기본적으로 애플리케이션 디렉터리로 설정되었으므로 항상 애플리케이션 디렉터리에서 네이티브 라이브러리를 찾습니다.

애플리케이션 디렉터리는 단일 파일 앱에 더 이상 NATIVE_DLL_SEARCH_DIRECTORIES에 추가되지 않으며, NativeAOT에서 rpath 설정이 제거되었습니다. 두 경우 DllImportSearchPath.AssemblyDirectory 모두(P/Invokes의 기본 동작에 포함됨)는 애플리케이션 디렉터리를 의미합니다. 해당 값을 지정하거나 기본값을 그대로 두면 .NET은 애플리케이션 디렉터리를 찾습니다. 해당 값이 없는 플래그를 지정하면 .NET은 더 이상 애플리케이션 디렉터리를 찾지 않습니다.

도입된 버전

.NET 10

이전 동작

이전에는 네이티브 라이브러리를 로드할 때 단일 파일 애플리케이션이 항상 애플리케이션 디렉터리를 살펴보았습니다. Windows가 아닌 운영 체제에서는 네이티브 라이브러리를 로드할 때 NativeAOT 애플리케이션이 항상 애플리케이션 디렉터리에서 확인되었습니다.

다음의 P/Invoke는 애플리케이션 디렉터리에서 lib을 찾은 후 존재하면 거기서 로드했습니다.

[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern void Method()

새 동작

.NET 10부터 단일 파일 애플리케이션은 네이티브 라이브러리 로드에 대한 검색 경로가 어셈블리 디렉터리를 포함하는 것으로 표시되는 경우에만 애플리케이션 디렉터리를 찾습니다.

// Look in System32 on Windows.
// Search the OS on non-Windows.
[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern void Method()

// Look next to the single-file app because assembly directory
// means application directory for single-file apps.
[DllImport("lib")
[DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
static extern void Method()

// Look next to the single-file app (because assembly
// directory is searched by default), then default OS search.
[DllImport("lib")
static extern void Method()

파괴적 변경 유형

이는 동작 변경.

변경 이유

기존 동작(검색 경로에서 제외하더라도 항상 애플리케이션 디렉터리에서 확인)으로 인해 혼동이 발생했습니다. 또한 검색 플래그가 일반(단일 파일이 아닌, NativeAOT가 아닌) .NET 애플리케이션에서 처리되는 방식과도 일치하지 않습니다.

P/Invoke 또는 네이티브 라이브러리 로드에 애플리케이션/어셈블리 디렉터리가 필요한 경우 이전에 지정하지 않은 경우 지정합니다 DllImportSearchPath.AssemblyDirectory.

RPATH NativeAOT에서 설정을 원하는 경우 해당 링커 인수를 프로젝트에 명시적으로 추가합니다.

영향을 받는 API

참고하십시오