리소스 관리 시스템
리소스 관리 시스템에는 빌드 시간 및 런타임 기능이 모두 있습니다. 빌드 시 시스템은 앱과 함께 패키지되는 여러 변형의 모든 리소스에 대한 인덱스를 만듭니다. 이 인덱스는 PRI(패키지 리소스 인덱스)이며 앱 패키지에도 포함됩니다. 런타임 시 시스템은 적용 중인 사용자와 시스템 설정을 검색하고 PRI의 정보를 참조하고 자동으로 이러한 설정에 대한 최적의 일치인 리소스를 로드합니다.
모든 앱 패키지는 앱 리소스의 이진 인덱스를 포함해야 합니다. 이 인덱스는 빌드 시 만들어지고 하나 이상의 PRI(패키지 리소스 인덱스) 파일에 포함됩니다.
- PRI 파일은 실제 문자열 리소스와 패키지와 다양한 파일을 참조하는 인덱싱된 파일 경로 집합을 포함합니다.
- 패키지는 일반적으로 언어당 resources.pri라는 하나의 PRI 파일을 포함합니다.
- ResourceManager 개체가 인스턴스화되면 각 패키지 루트에 있는 resources.pri 파일이 자동으로 로드됩니다.
- PRI 파일은 MakePRI.exe 도구를 사용하여 만들고 덤프할 수 있습니다.
- 일반적인 앱 개발에서는 이미 Visual Studio 컴파일 워크플로에 통합되어 있으므로 MakePRI.exe가 필요 없습니다. 그리고 Visual Studio는 전용 UI에서 PRI 파일 편집을 지원합니다. 그러나 로컬라이저 및 로컬라이저에서 사용하는 도구에서 MakePRI.exe를 사용할 수도 있습니다.
- 각 PRI 파일에는 리소스 맵이라고 하는 명명된 리소스 컬렉션이 포함되어 있습니다. 패키지에서 PRI 파일을 로드할 때 리소스 맵 이름이 패키지 ID 이름과 일치하는지 확인합니다.
- PRI 파일은 데이터만 포함하므로 PE(이식 가능한 실행 파일) 형식을 사용하지 않습니다. Windows용 리소스 형식으로 데이터 전용으로 설계되었습니다. Win32 앱 모델의 DLL에 포함된 리소스를 대체합니다.
앱 리소스에 프로그래밍 방식으로 액세스하는 가장 간단한 방법은 Windows.ApplicationModel.Resources 네임스페이스 및 ResourceLoader 클래스를 사용하는 것입니다. ResourceLoader는 리소스 파일, 참조된 라이브러리 또는 기타 패키지 세트의 문자열 리소스에 대한 기본 액세스를 제공합니다.
ResourceManager 클래스(Windows.ApplicationModel.Resources.Core 네임스페이스에 있음)는 열거 및 검사 등 리소스에 대한 추가 정보를 제공합니다. 이는 ResourceLoader 클래스가 제공하는 것 이상입니다.
NamedResource 개체는 여러 언어 또는 기타 한정된 변형이 있는 개별 논리 리소스를 나타냅니다. 문자열 리소스 식별자(예: Header1
) 또는 리소스 파일 이름(예: logo.jpg
)을 사용하여 자산 또는 리소스의 논리적 보기를 설명합니다.
ResourceCandidate 개체는 영어의 경우 "Hello World" 문자열 또는 scale-100 해상도에 해당하는 한정된 이미지 리소스인 "logo.scale-100.jpg"와 같은 구체적인 단일 리소스 값 및 해당 한정자를 나타냅니다.
앱에서 사용할 수 있는 리소스는 ResourceMap 개체를 사용하여 액세스할 수 있는 계층 구조 컬렉션에 저장됩니다. ResourceManager 클래스는 앱에 대한 다양한 패키지에 해당하는 앱에서 사용하는 다양한 최상위 ResourceMap 인스턴스에 대한 액세스를 제공합니다. MainResourceMap 값은 현재 앱 패키지에 대한 리소스 맵에 해당하며, 참조된 모든 프레임워크 패키지를 제외합니다. 각 ResourceMap은 패키지의 매니페스트에 지정된 패키지 이름으로 지정됩니다. ResourceMap 내에는 NamedResource 개체가 추가로 포함된 하위 트리가 있습니다(ResourceMap.GetSubtree 참조). 하위 트리는 일반적으로 리소스가 포함된 리소스 파일에 해당합니다. 자세한 내용은 UI 및 앱 패키지 매니페스트의 문자열 지역화 및 배율, 테마, 고대비 등에 맞춘 이미지 및 자산 로드를 참조하세요.
예를 들어 다음과 같습니다.
// using Windows.ApplicationModel.Resources.Core;
ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
ResourceContext resourceContext = ResourceContext.GetForCurrentView()
var str = resourceMap.GetValue("String1", resourceContext).ValueAsString;
참고 리소스 식별자는 URI(Uniform Resource Identifier) 의미 체계에 따라 URI 조각으로 처리됩니다. 예를 들어 GetValue("Caption%20")
는 GetValue("Caption ")
로 처리됩니다. "?" 또는 "#"는 리소스 경로 평가를 종료하므로 사용하지 마세요. 예를 들어 "MyResource?3"은 "MyResource"로 처리됩니다.
ResourceManager는 앱의 문자열 리소스에 대한 액세스를 지원할 뿐만 아니라 다양한 파일 리소스를 열거하고 검사하는 기능도 유지 관리합니다. 파일 및 파일 내에서 시작하는 다른 리소스 간의 충돌을 방지하기 위해 인덱싱된 파일 경로는 모두 예약된 "Files" ResourceMap 하위 트리 내에 있습니다. 예를 들어 \Images\logo.png
파일은 Files/images/logo.png
리소스 이름에 해당합니다.
StorageFile API는 파일에 대한 참조를 리소스로 투명하게 처리하며, 일반적인 사용 시나리오에 적합합니다. ResourceManager는 현재 컨텍스트를 재정의하려는 경우와 같은 고급 시나리오에만 사용해야 합니다.
리소스 후보는 리소스 한정자 값(언어, 배율, 대비 등) 의 컬렉션인 특정 ResourceContext에 따라 선택됩니다. 기본 컨텍스트는 재정의되는 경우를 제외하고 각 한정자 값에 대한 앱의 현재 구성을 사용합니다. 예를 들어 이미지와 같은 리소스는 배율로 한정될 수 있으며, 이는 모니터에 따라 달라지므로 애플리케이션 보기마다 다를 수 있습니다. 이러한 이유로 각 애플리케이션 보기에는 고유한 기본 컨텍스트가 있습니다. 지정된 보기에 대한 기본 컨텍스트는 ResourceContext.GetForCurrentView를 사용하여 가져올 수 있습니다. 리소스 후보를 검색할 때마다 ResourceContext 인스턴스를 전달하여 지정된 보기에 가장 적합한 값을 얻어야 합니다.