MSIX 프레임워크 패키지 및 동적 종속성

이 문서에서는 MSIX 프레임워크 패키지와 관련된 중요한 개념을 소개합니다. 이 문서의 정보는 Windows 앱 SDK 및 Windows 11 OS의 동적 종속성 기능에 대한 디자인 및 용도를 더 잘 이해하는 데 도움이 되는 유용한 컨텍스트를 제공합니다. 이 기능을 사용하면 앱에서 런타임에 MSIX 프레임워크 패키지를 참조하고 사용할 수 있습니다.

프레임워크 패키지 및 패키지 그래프

MSIX는 최신 패키징 및 배포 환경을 제공하는 패키지 형식입니다. 또한 MSIX 프레임워크 패키지를 통해 재배포 가능한 라이브러리, 콘텐츠 및 구성 요소를 패키징할 수 있는 깔끔하고 신뢰할 수 있는 방법을 제공합니다. MSIX 프레임워크 패키지를 사용하면 패키지 앱에서 구성 요소를 앱 패키지에 번들로 묶는 대신 사용자 디바이스의 단일 공유 원본을 통해 구성 요소에 액세스할 수 있습니다. 일반적인 프레임워크 패키지에는 Windows 앱 SDK(WinUI3 포함), WinUI2, VCLibs 및 DirectX 런타임이 포함됩니다.

Windows 8부터 Windows 10 및 Windows 11까지 이어지는 모든 프로세스에는 프레임워크, 리소스, 옵션 및 기본 패키지를 포함하여 앱에서 사용할 수 있는 모든 패키지의 목록을 제공하는 패키지 그래프가 있습니다. 이 그래프를 통해 앱은 참조 패키지에서 제공하는 DLL, 콘텐츠 및 런타임 클래스 선언을 로드할 수 있습니다. 과거에는 해당 그래프가 프로세스를 만들 때 수정되었으나, 런타임 때 변경할 수 있는 방법이 없었습니다.

  • 패키지 앱의 경우 그래프는 앱의 패키지 매니페스트의 PackageDependency 요소에 선언된 패키지 종속성을 기반으로 하여 초기화되었습니다. 이는 일반적으로 패키징된 앱을 빌드할 때 프로젝트 참조 및 종속성을 기반으로 하는 빌드 프로세스 중에 수행되었습니다.
  • 패키징되지 않은 앱의 경우 패키지 그래프가 비어 있어 변경할 수 없었습니다. 따라서 패키징되지 않은 앱은 표준 DLL 검색 순서로 제한되었으며 프레임워크 패키지에 액세스할 수 없었습니다.

이 정적 패키지 그래프 제한은 Windows 앱 SDK와 Windows 11 모두에서 동적 종속성 지원이 도입되면서 해제되었습니다. 개발자는 동적 종속성을 사용하여 런타임에 앱에서 MSIX 프레임워크 패키지를 참조하고 사용할 수 있습니다. 동적 종속성은 앱에서 정적 패키지 그래프 제한을 제거하고, 개발자는 프레임워크 패키지를 활용하려는 방법을 결정할 수 있습니다.

동적 종속성에 대한 기본 시나리오

동적 종속성을 사용하면 모든 앱에서 런타임에 패키지 프레임워크 종속성을 추가할 수 있지만 이 기능은 주로 외부 위치로 패키징된 앱이나 패키징되지 않은 앱에서 사용하기 위한 것입니다. 패키징된 앱은 패키지 매니페스트의 PackageDependency 요소를 통해 정적 종속성을 계속 추가할 수 있습니다.

프레임워크 패키지 서비스 모델

동적 종속성 기능은 런타임에 동적으로 참조되고 사용되는 프레임워크 패키지에 대한 서비스 파이프라인의 무결성을 유지합니다.

MSIX 프레임워크 패키지는 병렬 모델에서 서비스를 지원합니다. 즉, 각 버전이 별도의 고유한 버전이 지정된 폴더에 설치됩니다. 이렇게 하면 최신 버전의 프레임워크 패키지를 설치하는 경우에도 사용 중인 애플리케이션에서 가동 및 실행 상태를 유지할 수 있습니다. OS에는 해당 패키지에 대한 설치 시간 참조런타임 참조의 존재 여부에 따라 지정된 프레임워크 패키지의 이전 버전을 삭제하는 경우에 대한 제거 논리가 있습니다.

  • 앱이 설치되면 프레임워크 패키지에 대한 설치 시간 참조를 만들 수 있습니다. 이 참조는 앱이 설치되는 동안 OS에서 프레임워크 패키지를 제거하지 않도록 앱에 지정된 프레임워크 패키지에 대한 종속성이 있음을 OS에 알립니다.
  • 앱에서 프레임워크 패키지의 API 또는 콘텐츠를 사용해야 하는 경우 런타임 참조를 프레임워크 패키지에 추가할 수 있습니다. 이 참조는 프레임워크 패키지가 활성 사용 상태이고 버전 업데이트를 병렬로 처리하도록 OS에 알립니다. 새 버전의 프레임워크 패키지가 설치되어 있지만 실행 중인 앱에 이전 버전이 사용되고 있는 경우 OS는 이전 버전에 대한 모든 런타임 참조가 제거될 때까지 이전 버전을 제거할 수 없습니다.

예를 들어 다음과 같은 시나리오가 있습니다.

  • 앱 A가 실행 중이며 지정된 프레임워크 패키지의 버전 1.0.0.0을 사용하고 있습니다.
  • 앱 B가 설치되어 있으며, 동일한 프레임워크 패키지의 버전 1.0.0.1에 종속됩니다.

이 시나리오에서는 두 버전의 프레임워크 패키지가 모두 설치되고 앱 A앱 B 모두에서 사용하고 있습니다. 그러나 사용자가 앱 A를 닫았다가 다시 시작하면 프레임워크 패키지의 최신 버전 1.0.0.1이 선택됩니다. 이 시점에서 런타임 참조 요구 사항은 프레임워크 패키지 버전 1.0.0.0에 대해 더 이상 유효하지 않으며, OS에서 1.0.0.0 버전을 안전하게 제거할 수 있습니다. 나중에 사용자가 앱 A앱 B를 제거하면 설치 시간 참조 요구 사항이 더 이상 유효하지 않으며, OS에서 프레임워크 패키지를 완전히 제거하는 것이 안전합니다.

PackageDependency 요소를 사용하여 프레임워크 패키지에 대한 정적 참조를 지정하는 패키지 앱의 경우 앱이 설치되거나 제거될 때 OS에서 프레임워크 패키지에 대한 설치 시간 참조를 추적합니다. 동적 종속성 기능을 사용하여 관리되는 런타임 참조의 경우 OS는 패키징된 앱이 실행되는 시기를 인식하고, 최신 프레임워크 패키지를 사용할 수 있는 경우에도 사용 중인 프레임워크 패키지를 제거하지 않습니다.