2013-12-11 16 views
6

Qui potrebbe mancare qualcosa di molto semplice, ma qual è il vantaggio dell'utilizzo di reflection per recuperare una risorsa incorporata dallo stesso assembly che contiene la risorsa anziché semplicemente recuperandolo tramite un file .resx? Lo vedo molto ma non capisco - c'è un motivo per usare Assembly.GetExecutingAssembly().GetManifestResourceStream(resource) rispetto al file resx Resources.resource? Anche Microsoft lo fa: How to embed and access resources.File di risorse (.resx) vs reflection per accedere a una risorsa incorporata

Cosa intendo esattamente: supponiamo di avere un assembly MyAssembly che contiene una risorsa incorporata Config.xml. L'assemblea ha MyClass che implementa un metodo che restituisce detto risorsa come una stringa:

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

Spesso, vedo questo implementato in questo modo, utilizzando la riflessione per recuperare la risorsa:

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

Perché utilizzare GetManifestResourceStream() quando è possibile:

  1. aggiungere un file di risorse (Resource.resx) al progetto MyAssembly in Visual Studio;
  2. aggiungere Config.xml ai "File" della risorsa;
  3. ottenere il contenuto di Config.xml in un modo molto più semplice: string xml = Resource.Config;

io non so come Visual Studio gestisce i file .resx internamente, ma dubito che copia semplicemente la risorsa nel file .resx (in nel qual caso si finirebbe con risorse duplicate). Presumo che non usi la reflection internamente, quindi perché non usare semplicemente i file .resx in situazioni come questa, che mi sembrano molto più performanti?

+1

Ottenere l'assembly * potrebbe * caricare l'assembly satellite compatibile con la cultura, mentre caricare il resx ti lascerà la responsabilità di scegliere quello corretto per la cultura corrente. –

risposta

3

ma qual è il vantaggio di utilizzare riflessione per recuperare una risorsa incorporata

Il beneficio comune che c'è dietro alcun motivo per convertire i dati da un formato ad un altro. Velocità, velocità, velocità e convenienza.

XML è un formato discreto per conservare le risorse. Avrai un'ottima garanzia che puoi ancora recuperare la risorsa originale tra 10 anni quando l'originale si è perso nella nebbia del tempo e un paio di modifiche della macchina senza buoni backup. Ma è piuttosto un formato sucky da leggere, XML è molto prolisso e l'individuazione di un frammento richiede la lettura dall'inizio del file.

Problemi che scompaiono quando Resgen.exe compila il file .xml in un file .resource. Un formato binario adatto per essere collegato ai metadati dell'assieme e contiene i byte originali nella risorsa. Ed è direttamente mappato in memoria quando viene caricato l'assembly, non è necessario trovare un altro file e aprirlo, leggerlo e convertire i dati. Grande differenza.

Utilizzare la Progettazione risorse per evitare di dover utilizzare direttamente GetManifestResourceStream(). Ancora più comodità.

+0

Punti giusti, grazie.Mi sembra, tuttavia, che il vantaggio in termini di velocità dell'utilizzo della riflessione per un accesso diretto alle risorse sarebbe probabilmente evidente solo se stavi memorizzando una grande quantità di file di risorse in .resx, mentre per un piccolo numero di risorse integrate la riflessione sarebbe in realtà più lento (dal momento che è necessario 'GetManifestResourceStream' e quindi convertirlo nel formato appropriato) rispetto alla lettura da .resx? – w128

+4

Sembra che tu stia operando dal mito comune che "Reflection is slow". È lento quando si confronta, ad esempio, utilizzando direttamente una proprietà o usando Reflection per ottenere un valore di proprietà. Certo, non puoi battere un nanosecondo con Reflection. GetManifestResourceStream è * non * lento rispetto all'apertura di un file. E 'facilmente 50.000 volte più veloce, dare o prendere un ordine di grandezza :) –