MRM 中的檔案資源
MRM 中的檔案資源基本上與 String 資源相同,不同之處在於在運行時間, ResourceCandidate.Kind 屬性 會是 Path ,而不是 String。 資源值只是字串 - 檔案名 - 而不是實際的檔案內容。 事實上,在大部分情況下,編製索引的檔案甚至不需要存在於建置階段。
如果您的目標應用程式將使用內建的 MRT 運行時間 (Windows.ApplicationModel.Resources),您可以使用 ResourceCandidate.GetValueAsFileAsync 或 ResourceCandidate.GetValueAsStreamAsync 來自動尋找和載入檔案。 如果您使用 MRT 的 WinApp SDK 版本(Microsoft.Windows.ApplicationModel.Resources),則必須自行手動載入檔案。 您也可以選擇使用 buit-in MRT 執行時間手動載入檔案。
有兩種方式可將檔案新增至 MRM 索引器:
- MrmIndexFile 是最一般且最具彈性的功能。
- MrmIndexFileAutoQualifiers 會自動從檔名推斷資源名稱和限定符。
請注意, MrmIndexResourceContainerAutoQualifiers 不會將檔案資源新增至索引器;而是會在建置階段載入具名檔案,並將內嵌的資源直接複製到索引器。
如需依名稱參考檔案的替代專案,您可以使用 MrmIndexEmbeddedData 直接在 PRI 檔案中內嵌數據 - 如需詳細資訊,請參閱下方的內嵌數據。
檔案型資源的主要目的是將字串傳遞至 CreateFile()、fopen()或 std::fstream 建構函式等函式。 由於檔案的最後一個磁碟上路徑在建置時通常不知道,檔名通常是相對於應用程式工作目錄解析的相對路徑(或運行時間的一些其他已知目錄)。 雖然可以包含任何任意字串作為檔名(包括絕對路徑或網路路徑),但這通常並不有用。
透過其中 一個 MrmCreateIndexer... 函式建立索引器時,您必須指定 projectRoot 參數。 MrmIndexResourceContainerAutoQualifiers 會使用此參數來找出磁碟上的檔案來剖析,以及 MrmIndexFileAutoQualifiers 用來計算絕對路徑的相對路徑。 MrmIndexFile 會忽略它。
將檔案內嵌為數據可減少應用程式所需的儲存空間,並相對於參考檔名來提升其效能。 不過,使用此功能有一些缺點,特別是在內部迴圈應用程式開發期間。
在典型的 Windows 系統上,由於配置磁碟空間的方式,每個檔案平均浪費 2 kb 的磁碟空間。 對於包含許多小型檔案的應用程式(例如圖示),此平均值可能更高。 藉由直接將二進位檔數據內嵌在 PRI 檔案中,就不會浪費此個別檔案空間。
此外,載入外部資源檔的速度比直接從 PRI 檔案讀取二進位數據慢,因為每個檔案開啟作業都需要額外的磁碟存取、安全性檢查等等。 PRI 檔案一律會載入為記憶體對應檔案,因此存取數據的速度會更快。
儘管有這些優點,但使用內嵌二進位數據有限制,特別是在內部迴圈開發期間:
- 建置時間會增加,因為包含二進位數據的檔案必須載入並新增至索引器。 新增以檔案為基礎的資源在建置階段不需要額外的磁碟存取權(磁碟存取會延後到運行時間)。
- 對 PRI 檔案進行偵錯問題(透過 XML 傾印)比較困難,因為 XML 傾印會包含 BASE64 編碼的二進位數據,而不是人類可讀取的檔名。 此外,XML 傾印檔案會大幅增加,使得偵錯任何問題更加困難。
- 由於檔案的內容會直接內嵌在 PRI 檔案中,因此無法再即時交換資產。 任何內嵌資源的變更都需要完整重建 PRI 檔案。 由於檔案型資源只包含檔名,因此可以隨時更新實際的資產檔案。
- 針對已封裝的應用程式,AppXManifest 中所列的影像資源,例如 [開始] 功能表圖示 -- 無法內嵌, 而且必須 指定為檔案資源。
基於這些原因,一般經驗法則是在內部迴圈開發期間使用檔案型資源,但請考慮在最終生產組建中使用內嵌的二進位資源(指令清單資源除外)。 針對已封裝的應用程式,請考慮將AppXManifest資源(例如開始功能表圖示)放在與其他資源的個別直接導向中,以簡化建置程式(AppXManifest 資源會新增為檔案,以及其他新增為內嵌數據的資源)。