29 agosto 2007

VB.NET : Memorizzare un file qualsiasi all'interno di un assembly

Il Framework .NET offre la possibilità di memorizzare, all'interno di un assembly, un qualunque tipo di file.

Per fare ciò è necessario:

1) importare il file all'interno del progetto utilizzando il menù Progetto\Aggiungi elemento esistente;

2) selezionare il file all'interno del solution explorer e selezionare il menù contestuale Proprietà;

3) modificare la proprietà Operazione di Generazione in Risorsa Incorporata;

A questo punto il file "viaggia" assieme all'assembly compilato.

Per recuperare a run-time il file è sufficiente utilizzare il seguente pezzo di codice:


  .
  .
  Dim asm As System.Reflection.Assembly
  Dim st As System.IO.Stream
  Dim bytearray As Byte()
  asm = Reflection.Assembly.GetExecutingAssembly
  st = asm.GetManifestResourceStream("<RootNamespace>.file.ext")
  ReDim bytearray(CInt(st.Length) - 1)
  st.Read(bytearray, 0, CInt(st.Length))
  st.Close()
  .
  .


<RootNameSpace> è il nome del namespace root dell'assembly mentre file.ext è il nome del file inserito nel progetto.

La chiamata del metodo GetManifestResourceStream() può sollevare un'eccezione se il file supera la dimensione di 2GB.

Se il file non esiste all'interno dell'assembly o il nome del namespace è sbagliato, si ottiene un'eccezione nel momento in cui si effettua la chiamata al metodo GetManifestResourceStream().

Questa tecnica è utile se si vogliono memorizzare icone o immagini delle nostre applicazioni.
La seguente Function recupera un'icona memorizzata nell'assembly:


Private Shared Function GetResourceIcon(ByVal rootNamespace As String, _
    ByVal iconName As String) As Icon
  Dim icon As System.Drawing.Icon = Nothing
  Dim asm As System.Reflection.Assembly = Nothing
  Dim st As System.IO.Stream = Nothing
  asm = Reflection.Assembly.GetExecutingAssembly
  Try
    st = asm.GetManifestResourceStream("WorkItemReminder." + iconName)
    icon = New System.Drawing.Icon(st)
  Catch ex As Exception
    icon = Nothing
  Finally
    If Not st Is Nothing Then
      st.Close()
    End If
  End Try
  Return icon
End Function

Nessun commento: