2013-12-11 19 views
6

Może brakuje mi czegoś bardzo prostego tutaj, ale jaka jest korzyść z używania odbicia w celu pobrania osadzonego zasobu z tego samego zestawu , który zawiera zasób w przeciwieństwie do po prostu pobierając go za pomocą pliku .resx? Widzę to bardzo często, ale nie rozumiem - czy jest powód do używania Assembly.GetExecutingAssembly().GetManifestResourceStream(resource) w porównaniu do pliku Resx Resources.resource? Nawet Microsoft to robi: How to embed and access resources.Plik zasobu (.resx) kontra odbicie w celu uzyskania dostępu do osadzonego zasobu

Co mam na myśli: załóżmy, że mam zespół MyAssembly, który zawiera osadzony zasób Config.xml. Zespół ma MyClass który implementuje metodę, która zwraca wymieniony zasób jako wyrażenie:

public string GetConfigXML() // returns the content of Config.xml as a string 

Często widzę to realizowane w ten sposób, przy użyciu odbicia do pobierania zasobów:

public string GetConfigXML() 
{ 
    Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Config.xml"); 
    string xml = GetStringFromStream(xmlStream); 
    return xml; 
} 

Dlaczego korzystania GetManifestResourceStream() gdy jest można:

  1. dodać plik zasobów (Resource.resx) do projektu w Visual Studio MyAssembly;
  2. dodać Config.xml do zasobu "Pliki";
  3. uzyskać zawartość Config.xml w znacznie prostszy sposób: string xml = Resource.Config;

nie wiem jak Visual Studio obsługuje .resx pliki wewnętrznie, ale wątpię, to po prostu kopiuje zasobu do pliku .resx (w w takim przypadku otrzymasz zduplikowane zasoby). Zakładam, że wewnętrznie nie korzysta też z odbicia, więc dlaczego nie po prostu użyć plików .resx w takich sytuacjach, co wydaje mi się bardziej przyjazne dla wydajności?

+1

Przeniesienie go przez zespół * może * spowoduje załadowanie do ciebie satelitarnego zestawu kultury, podczas gdy ładowanie resxu pozostawia ci odpowiedzialność za wybranie właściwego dla aktualnej kultury. –

Odpowiedz

3

ale co jest zaletą przy użyciu odbicia do pobierania osadzonego zasobu

wspólnych korzyści, co jest za jakiegokolwiek powodu do konwersji danych z jednego formatu na inny. Prędkość, prędkość, szybkość i wygoda.

XML jest całkiem przyzwoitym formatem, w którym przechowywane są twoje zasoby. Będziesz mieć bardzo dobrą gwarancję, że nadal będziesz mógł odzyskać oryginalny zasób za 10 lat, kiedy oryginał zagubił się we mgle czasu i para zmian w maszynie bez dobrych kopii zapasowych. Ale to całkiem sprytny format, z którego trzeba czytać, XML jest bardzo obszerny, a odnalezienie fragmentu wymaga czytania od początku pliku.

Problemy znikające, gdy Resgen.exe kompiluje plik .xml do pliku .resource. Format binarny, który jest odpowiedni do dołączenia do metadanych zestawu i zawiera oryginalne bajty w zasobie. I jest bezpośrednio mapowany do pamięci, gdy twój zestaw jest ładowany, nie trzeba szukać innego pliku i otwierać go, czytać i konwertować dane. Duża różnica.

Należy użyć Projektanta zasobów, aby uniknąć konieczności używania GetManifestResourceStream() bezpośrednio. Jeszcze więcej wygody.

+0

Fajne punkty, dziękuję.Wydaje mi się jednak, że korzyść płynąca z wykorzystania refleksji do bezpośredniego dostępu do zasobów prawdopodobnie stałaby się oczywista, gdybyś przechowywał dużą liczbę plików zasobów w .resx, podczas gdy dla niewielkiej liczby odbicie zasobów osadzonych byłby faktycznie wolniej (ponieważ musisz 'GetManifestResourceStream', a następnie przekonwertować go do odpowiedniego formatu) w porównaniu do czytania z .resx? – w128

+4

Wydaje się, że działasz na podstawie powszechnego mitu, że "Refleksja jest wolna". Jest powolny, gdy porównujesz, powiedzmy, użycie właściwości bezpośrednio lub użycie Reflection, aby uzyskać wartość właściwości. Jasne, nie możesz pokonać nanosekundy Reflection. GetManifestResourceStream jest * nie * wolny w porównaniu do otwierania pliku. Łatwo jest 50 000 razy szybciej, dać lub przyjąć rząd wielkości :) –

Powiązane problemy