MRM의 파일 리소스

MRM의 파일 리소스는 기본적으로 문자열 리소스와 동일합니다. 런타임에 ResourceCandidate.Kind 속성String 대신 Path가 됩니다. 리소스 값은 실제 파일 내용이 아닌 문자열(파일 이름)일 뿐입니다. 실제로 대부분의 경우 인덱싱되는 파일은 빌드 시간에 존재할 필요도 없습니다.

대상 애플리케이션이 기본 제공 MRT 런타임(Windows.ApplicationModel.Resources)을 사용하는 경우 ResourceCandidate.GetValueAsFileAsync 또는 ResourceCandidate.GetValueAsStreamAsync를 사용하여 자동으로 파일을 찾아서 로드할 수 있습니다. WINApp SDK 버전의 MRT(Microsoft.Windows.ApplicationModel.Resources)를 사용하는 경우 파일을 직접 로드해야 합니다. 또한 buit-in MRT 런타임을 사용하여 파일을 수동으로 로드하도록 선택할 수도 있습니다.

MRM 인덱서에 파일을 추가하는 방법에는 두 가지가 있습니다.

MrmIndexResourceContainerAutoQualifiers는 파일 리소스를 인덱서에 추가하지 않고, 대신 빌드 시 명명된 파일을 로드하고 포함된 리소스를 인덱서에 직접 복사합니다.

이름으로 파일을 참조하는 대신 MrmIndexEmbeddedData를 사용하여 PRI 파일에 직접 데이터를 포함할 수 있습니다. 자세한 내용은 아래 포함된 데이터를 참조하세요.

파일 이름 지정

파일 기반 리소스의 주요 목적은 CreateFile(), fopen() 또는 std::fstream 생성자와 같은 함수에 문자열을 전달하는 것입니다. 파일의 최종 디스크 내 경로는 일반적으로 빌드 시 알 수 없으므로 일반적으로 파일 이름은 런타임에 앱의 작업 디렉터리(또는 다른 잘 알려진 디렉터리)에 대해 확인되는 상대 경로입니다. 임의의 문자열을 파일 이름(절대 또는 네트워크 경로 포함)으로 포함할 수 있지만 일반적으로 유용하지는 않습니다.

프로젝트 루트 및 상대 파일 이름

MrmCreateIndexer... 함수 중 하나를 통해 인덱서 만들 때 projectRoot 매개 변수를 지정해야 합니다. 이 매개 변수는 MrmIndexResourceContainerAutoQualifiers에서 구문 분석할 디스크의 파일을 찾고 MrmIndexFileAutoQualifiers가 절대 경로에서 상대 경로를 계산하는 데 사용됩니다. MrmIndexFile에서 무시됩니다.

포함된 데이터.

파일을 데이터로 포함하면 앱에 필요한 스토리지 공간을 줄이고 파일 이름을 참조하는 것에 비해 성능이 향상될 수 있습니다. 그럼에도 불구하고 특히 내부 루프 앱 개발 중에 이 기능을 사용하는 데 몇 가지 단점이 있습니다.

일반적인 Windows 시스템에서 모든 파일은 디스크 공간이 할당되는 방식으로 인해 평균 2kb의 디스크 공간을 낭비합니다. 작은 파일(예: 아이콘)을 많이 포함하는 앱의 경우 이 평균은 더 높을 수 있습니다. 이진 파일 데이터를 PRI 파일에 직접 포함하면 파일당 이 공간이 낭비되지 않습니다.

또한 모든 파일 열기 작업에는 추가 디스크 액세스, 보안 검사 등이 필요하므로 외부 리소스 파일을 로드하는 것이 PRI 파일에서 직접 이진 데이터를 읽는 것보다 느립니다. PRI 파일은 항상 메모리 매핑 파일로 로드되므로 데이터에 더 빠르게 액세스할 수 있습니다.

이러한 이점에도 불구하고 포함된 이진 데이터를 사용하는 데는 특히 내부 루프 개발 중에 제한 사항이 있습니다.

  • 이진 데이터가 포함된 파일을 로드하고 인덱서에 추가해야 하므로 빌드 시간이 증가합니다. 파일 기반 리소스를 추가하는 데에 빌드 시간 추가 디스크 액세스가 필요하지 않습니다(런타임까지 디스크 액세스가 지연됨).
  • XML 덤프를 통해 PRI 파일의 디버깅 문제는 사람이 읽을 수 있는 파일 이름 대신 XML 덤프에 BASE64로 인코딩된 이진 데이터가 포함되므로 더 어렵습니다. 또한 XML 덤프 파일은 훨씬 커지므로 디버깅이 더 어려워집니다.
  • 파일의 내용이 PRI 파일에 직접 포함되어 있으므로 더 이상 즉시 자산을 교환할 수 없습니다. 포함된 리소스를 변경하려면 PRI 파일을 완전히 다시 빌드해야 합니다. 파일 기반 리소스에는 파일 이름만 포함되므로 실제 자산 파일은 언제든지 업데이트할 수 있습니다.
  • 패키지된 앱의 경우 AppXManifest에 나열된 이미지 리소스(예: 시작 메뉴 아이콘)는 포함 할 수 없으며 반드시 파일 리소스로 지정해야 합니다 .

이러한 이유로 일반적으로 내부 루프 개발 중에 파일 기반 리소스를 사용하지만 최종 프로덕션 빌드에 포함된 이진 리소스를 사용하는 것이 좋습니다(매니페스트 리소스 제외). 패키지된 앱의 경우 빌드 프로세스를 간소화하기 위해 AppXManifest 리소스(예: 시작 메뉴 아이콘)를 다른 리소스와 별도의 directoy에 배치하는 것이 좋습니다(AppXManifest 리소스는 파일로 추가되고 다른 리소스는 포함된 데이터로 추가됨).