Udostępnij za pośrednictwem


Zasoby plików w narzędziu MRM

Zasoby plików w narzędziu MRM są zasadniczo takie same jak zasoby ciągów, z tą różnicą, że w czasie wykonywania właściwość ResourceCandidate.KindCandidate.Kind będzie ścieżka zamiast ciąg. Wartości zasobów to tylko ciągi — nazwy plików — a nie rzeczywista zawartość pliku. W większości przypadków indeksowane pliki nawet nie muszą istnieć w czasie kompilacji.

Jeśli aplikacja docelowa będzie używać wbudowanego środowiska uruchomieniowego MRT (Windows.ApplicationModel.Resources), możesz użyć ResourceCandidate.GetValueAsFileAsync lub ResourceCandidate.GetValueAsStreamAsStreamAsync, aby automatycznie zlokalizować i załadować plik. Jeśli używasz wersji zestawu SDK winapp mrT (Microsoft.Windows.ApplicationModel.Resources), musisz ręcznie załadować plik samodzielnie. Możesz również ręcznie załadować plik przy użyciu środowiska uruchomieniowego MRT.

Istnieją dwa sposoby dodawania plików do indeksatora MRM:

  • MrmIndexFile jest najbardziej ogólną i elastyczną funkcją.
  • MrmIndexFileAutoQualifiers automatycznie wywnioskuje zarówno nazwę zasobu, jak i kwalifikatory z nazwy pliku.

Należy pamiętać, że MrmIndexResourceContainerAutoQualifiers nie dodaje zasobu pliku do indeksatora; zamiast tego ładuje nazwany plik w czasie kompilacji i kopiuje zasoby osadzone bezpośrednio do indeksatora.

Aby uzyskać alternatywę do odwoływania się do plików według nazwy, możesz użyć MrmIndexEmbeddedData do osadzania danych bezpośrednio w pliku PRI — zobacz Osadzone dane poniżej, aby uzyskać więcej informacji.

Nazewnictwo plików

Podstawowym celem zasobu opartego na plikach jest przekazanie ciągu do funkcji, takich jak CreateFile(), fopen()lub konstruktor std::fstream. Ponieważ ostateczna ścieżka na dysku plików zwykle nie jest znana w czasie kompilacji, nazwy plików są zwykle ścieżkami względnymi, które będą rozpoznawane względem katalogu roboczego aplikacji (lub innego dobrze znanego katalogu) w czasie wykonywania. Chociaż istnieje możliwość uwzględnienia dowolnego ciągu jako nazwy pliku (w tym ścieżek bezwzględnych lub sieciowych), zwykle nie jest to przydatne.

Nazwy plików głównych i względnych projektu

Podczas tworzenia indeksatora za pomocą jednego z funkcji MrmCreateIndexer... należy określić parametr projectRoot. Ten parametr jest używany przez MrmIndexResourceContainerAutoQualifiers do lokalizowania plików na dysku do analizowania, a przez MrmIndexFileAutoQualifiers do obliczania ścieżek względnych ze ścieżek bezwzględnych. Jest on ignorowany przez MrmIndexFile.

Dane osadzone

Osadzanie plików jako danych może zmniejszyć ilość miejsca do magazynowania wymaganego dla aplikacji i zwiększyć jej wydajność względem odwołań do nazw plików. Niemniej jednak istnieją pewne wady używania tej funkcji, szczególnie podczas tworzenia aplikacji w pętli wewnętrznej.

W typowym systemie Windows każdy plik traci średnio 2 kb miejsca na dysku ze względu na sposób przydzielania miejsca na dysku. W przypadku aplikacji zawierających wiele małych plików (takich jak ikony) ta średnia może być jeszcze wyższa. Osadzając dane pliku binarnego bezpośrednio w pliku PRI, to miejsce na plik nie jest marnowane.

Ponadto ładowanie plików zasobów zewnętrznych jest wolniejsze niż odczytywanie danych binarnych bezpośrednio z pliku PRI, ponieważ każda operacja otwierania pliku wymaga dodatkowych dostępu do dysku, kontroli zabezpieczeń itd. Plik PRI jest zawsze ładowany jako plik mapowany na pamięć, więc uzyskiwanie dostępu do danych jest szybsze.

Pomimo tych korzyści korzystanie z osadzonych danych binarnych ma ograniczenia, szczególnie podczas tworzenia pętli wewnętrznej:

  • Czas kompilacji jest zwiększany, ponieważ pliki zawierające dane binarne muszą zostać załadowane i dodane do indeksatora. Dodanie zasobów opartych na plikach nie wymaga dodatkowego dostępu do dysku w czasie kompilacji (dostęp do dysku jest odroczony do czasu wykonania).
  • Problemy z debugowaniem pliku PRI (za pośrednictwem zrzutów XML) są trudniejsze, ponieważ zamiast czytelnych dla człowieka nazw plików zrzut XML będzie zawierać dane binarne zakodowane w formacie BASE64. Ponadto pliki zrzutu XML będą znacznie większe, co utrudnia debugowanie wszelkich problemów.
  • Ponieważ zawartość plików jest osadzona bezpośrednio w pliku PRI, nie jest już możliwe zamiana zasobów na bieżąco. Każda zmiana dowolnego zasobu osadzonego będzie wymagała pełnej ponownej kompilacji pliku PRI. Ponieważ zasoby oparte na plikach obejmują tylko nazwę pliku, rzeczywiste pliki zasobów można aktualizować w dowolnym momencie.
  • W przypadku spakowanych aplikacji zasoby obrazów wymienione w programie AppXManifest — takie jak ikony menu Start — nie mogą być osadzone i muszą być określone jako zasoby plików.

Z tych powodów ogólną regułą jest użycie zasobów opartych na plikach podczas opracowywania pętli wewnętrznej, ale rozważ użycie osadzonych zasobów binarnych dla końcowych kompilacji produkcyjnych (z wyjątkiem zasobów manifestu). W przypadku spakowanych aplikacji rozważ umieszczenie zasobów AppXManifest (takich jak ikony menu Start) w osobnym trybie directoy od innych zasobów, aby uprościć proces kompilacji (zasoby AppXManifest są dodawane jako pliki i inne zasoby dodane jako dane osadzone).