Il piccolo tip che posto oggi riguarda la realizzazione di un metodo di estensione che ci permette di recuperare il testo presente all’interno di un file di risorse incorporato in un assembly .NET.
Innanzitutto, per poter incorporare un file di testo all’interno di una dll (o eseguibile), è sufficiente inserire il file nel progetto e modificare la proprietà “Operazione di Compilazione” (selezionandolo e facendo tasto destro + proprietà) impostandola a “Risorsa Incorporata”
In questo modo, quando compiliamo la nostra dll, il file verrà incluso all’interno del file.dll generato dal compilatore.
Per poter, a livello di codice, recuperare il contenuto del file ed utilizzarlo in una nostra applicazione è necessario utilizzare il metodo GetManifestResourceStream() della classe Assembly e convertire lo stream recuperato in una stringa.
Il seguente metodo di estensione aggiunge un metodo alla classe Assembly che restituisce direttamente la stringa contenuta nella risorsa:
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
Imports System.Reflection
Imports System.IO
Public Module AssemblyExtensions
<Extension()> _
Public Function GetTextFromResource(ByVal asm As Assembly, ByVal resourceName As String) As String
Dim returnStr As String = ""
Dim st As Stream = Nothing
Try
st = asm.GetManifestResourceStream(resourceName)
If st isnot Nothing Then
Dim strreader As New StreamReader(st)
returnStr = strreader.ReadToEnd()
End If
Catch ex As Exception
Throw
Finally
If st IsNot Nothing Then st.Dispose()
End Try
Return returnStr
End Function
End Module
Utilizzando questo metodo, è sufficiente ottenere l’istanza della classe Assembly che contiene la risorsa desiderata e richiamare il metodo.
Il parametro resourceName è il nome della risorsa incorporata completo di eventuali namespace.
Un esempio di utilizzo è il seguente:
Se la risorsa è privata per l’assembly, il metodo non restituirà nulla così come se il nome della risorsa è errato.
Un metodo pratico per recuperare il corretto nome di una risorsa è quello di aprire l’assembly utilizzando Reflector, visualizzare le risorse dell’assembly e leggere il namespace completo.
In maniera analoga, il metodo restituisce stringa vuota se la dimensione del file contenente la risorsa è troppo grande (sopra i 2 Gb circa).
Un utilizzo delle risorse di testo all’interno di una dll potrebbe essere quello di avere dei file js o css all’interno di dll che contengono controlli web.
Commenti