다음을 통해 공유


API 세트 로더 작업

중요

이 항목의 정보는 모든 버전의 Windows 10 이상에 적용됩니다. 여기서는 이러한 버전을 "Windows"라고 하며 필요한 경우 예외를 호출합니다.

API 집합 은 라이브러리 로더의 OS 지원을 사용하여 라이브러리 바인딩 프로세스에 모듈 네임스페이스 리디렉션을 효과적으로 도입합니다. API 집합 계약 이름은 라이브러리 로더에서 API 집합의 적절한 구현을 포함하는 대상 호스트 이진 파일에 대한 참조의 런타임 리디렉션을 수행하는 데 사용됩니다.

로더가 런타임에 API 집합에 대한 종속성을 발견하면 로더는 이미지의 구성 데이터를 참조하여 API 집합에 대한 호스트 이진 파일을 식별합니다. 이 구성 데이터를 API 집합 스키마라고 합니다. 스키마는 OS의 속성으로 어셈블되며 지정된 디바이스에 포함된 이진 파일에 따라 API 집합과 이진 파일 간의 매핑이 다를 수 있습니다. 스키마를 사용하면 이진 호스트의 모듈 이름이 변경되었거나 다른 Windows 디바이스에서 완전히 리팩터링된 경우에도 단일 이진 파일의 가져온 함수를 다른 디바이스에서 올바르게 라우팅할 수 있습니다.

Windows는 API 집합을 사용하고 인터페이스하는 두 가지 표준 기술인 직접 전달역방향 전달을 지원합니다.

직접 전달

이 구성에서 사용하는 코드는 API 집합 모듈 이름을 직접 가져옵니다. 이 가져오기는 단일 작업에서 확인되며 오버헤드가 가장 적은 가장 효율적인 방법입니다. 개념적으로 이 해결 방법은 다음 예제와 같이 다른 Windows 디바이스의 서로 다른 이진 파일을 가리킬 수 있습니다.

가져온 API 집합: api-feature1-l1-1-0.dll

  • Windows PC ->feature1.dll
  • HoloLens ->feature1_holo.dll
  • IoT ->feature1_iot.dll

매핑은 사용자 지정 스키마 데이터 리포지토리에 유지되므로 .dll 끝나는 API 집합 이름은 디스크의 파일을 직접 참조하지 않습니다. API 집합 이름의 .dll 부분은 로더에 필요한 규칙일 뿐입니다. API 집합 이름은 실제 DLL 파일의 별칭 또는 가상 이름과 비슷합니다. 이렇게 하면 이름이 전체 Windows 장치 범위에서 이식 가능해집니다.

역방향 전달

API 집합 이름은 디바이스에서 모듈에 안정적인 네임스페이스를 제공하지만 모든 이진 파일을 이 새 시스템으로 변환하는 것이 항상 실용적인 것은 아닙니다. 예를 들어 애플리케이션이 몇 년 동안 일반적으로 사용되었을 수 있으며 애플리케이션의 이진 파일을 다시 컴파일하는 것은 불가능할 수 있습니다. 또한 일부 애플리케이션은 특정 API 집합이 도입되기 전에 빌드된 시스템에서 계속 실행해야 할 수 있습니다.

이러한 수준의 호환성을 수용하기 위해 Win32 API 표면의 하위 집합을 포함하는 모든 Windows 디바이스에 전달자 시스템이 제공됩니다. 이러한 전달자는 Windows PC에 도입된 모듈 이름을 사용하고 API 집합 시스템을 활용하여 모든 Windows 디바이스에서 호환성을 제공합니다.

로더 작업은 다음과 같이 작동합니다.

  1. Windows PC 이외의 디바이스에서는 로더에 디바이스에 없는 레거시 Windows PC 모듈 이름 종속성이 표시됩니다.
  2. 로더는 이 모듈에 대한 API 집합 전달자를 찾아 메모리에 로드합니다.
  3. 전달자에는 호출되는 지정된 함수에 대한 API 집합에 대한 매핑이 있습니다.
  4. 로더는 지정된 디바이스에 대한 적절한 호스트 이진 파일을 찾습니다.

개념적으로 매핑은 다음과 같습니다.

가져온 DLL: feature1.dll

  • Windows PC ->feature1.dll
  • HoloLens ->feature1.dll 전달자 ->api-feature1-l1-1-0.dll ->feature1_holo.dll
  • IoT ->feature1.dll 전달자 ->api-feature1-l1-1-0.dll ->feature1_iot.dll

최종 결과는 직접 전달과 기능적으로 동일하지만 애플리케이션 호환성을 최대화하는 방식으로 수행합니다.

참고

역방향 전달은 Win32 API 표면의 하위 집합에 대해서만 적용 범위를 제공합니다. Windows의 데스크톱 버전을 대상으로 하는 애플리케이션이 모든 Windows 디바이스에서 실행되는 것을 허용하지 않습니다.