Assembly: Embedded Resource elenco e lettura

Assembly: Embedded Resource elenco e lettura

Sviluppare in C# mi ha sempre portato ad utilizzare le Embedded Resource e devo dire che senza di loro la vita dello sviluppatore non sarebbe interessante come ora. Prima di mostrare il codice vediamo di rispondere ad una domanda importante:

cosa sono le Embedded Resource???

La risposta e’ molto semplice e si riassume nella seguente frase:

Le Embedded Resource sono delle risorse che al momento del build -tramite una definizione particolare- vengono “inglobate” nell’assembly e non copiate (di default) nella cartella di output.

Detta in questo modo sembra strano se non le hai mai utilizzate, ma una volta presa la confidenza necessaria non ci sara’ modo di tornare indietro.

csproj

Prima di tutto dobbiamo capire quali sono i file da “inglobare” e modificare il file csproj nel seguente modo:

1
2
3
4
5
6
7
<ItemGroup>
    <None Remove="EmbeddedResourceFiles\Image1.png" />
    <None Remove="EmbeddedResourceFiles\Image2.jpg" />
    <None Remove="EmbeddedResourceFiles\HelloWorld.txt" />
    <None Remove="EmbeddedResourceFiles\HelloWorld.docs" />
    <None Remove="EmbeddedResourceFiles\Intro.mp3" />
</ItemGroup>
1
2
3
4
5
6
7
<ItemGroup>
    <EmbeddedResource Include="EmbeddedResourceFiles\Image1.png" />
    <EmbeddedResource Include="EmbeddedResourceFiles\Image2.jpg" />
    <EmbeddedResource Include="EmbeddedResourceFiles\HelloWorld.txt" />
    <EmbeddedResource Include="EmbeddedResourceFiles\HelloWorld.docs" />
    <EmbeddedResource Include="EmbeddedResourceFiles\Intro.mp3" />
</ItemGroup>

Nella cartella EmbeddedResourceFiles creata nella root del progetto ho messo al suo interno una serie di file e quelli che desidero embeddare avranno la seguente sintassi all’interno del file csproj.

Tips: Se non avete voglia di fare questa modifica a mano, in Visual Studio vi bastera’ premere F4 sul file e vi si aprira’ una finestra. A questo punto dovrete cambiare la Build Action in Embedded resource

Tips: Per il codice proposto di seguito avrete la necessita’ di utilizzare i due seguenti using

1
2
using System.Reflection;
using System.IO;

Elenco risorse

Prima di utlizzare le risorse embeddate dobbiamo capire quali sono per potervi accedere tramite il nome.

1
2
3
4
5
6
7
private List<string> GetEmbeddedResourceList(string filter=null)
{
    var assembly = Assembly.GetExecutingAssembly();
    return assembly.GetManifestResourceNames()
        .Where(x => string.IsNullOrEmpty(filter) || x.Contains(filter))
        .ToList();
}

Il GetEmbeddedResourceList appena visto vi permettera’ di ottenere tutta la lista delle risorse aggiunte come Embedded resource.

Tips: In linea di massima, il nome della singola risorsa avra’ la seguente struttura:

1
<NameSpace>.<Folder>.<FileName>.<Ext>

Semplice no?

StreamReader Resource

Dopo avere ottenuto il nome delle risorse, non resta che leggerla

1
2
3
4
5
6
private StreamReader GetEmbeddedResourceByName(string resourceName)
{
    var assembly = Assembly.GetExecutingAssembly();
    Stream stream = assembly.GetManifestResourceStream(resourceName);
    return new StreamReader(stream);
}

In questo modo, avendo il resourceName possiamo accedere direttamente alla nostra risorsa prenderne lo StreamReader.

Ed ora? Ora che hai lo StreamReader a tua disposizione puoi divertirti come meglio credi.

Semplice, vero?