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:
- aggiungere un file di risorse (
Resource.resx
) al progettoMyAssembly
in Visual Studio; - aggiungere
Config.xml
ai "File" della risorsa; - 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?
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. –