Cómo incrustar y tener acceso a recursos mediante Visual Basic .NET o Visual Basic 2005

Seleccione idioma Seleccione idioma
Id. de artículo: 319291 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo paso a paso describe cómo utilizar Microsoft Visual Basic .NET o Microsoft Visual Basic 2005 para incrustar recursos como parte del ensamblado y tener acceso a los recursos en tiempo de ejecución.

Información general

.NET Framework pueden encapsular los archivos como parte de un ensamblado compilado. Estos archivos se conocen como recursos incrustados. Estos recursos son completamente independientes de los archivos .resources y .resx que están asociados con el ensamblado. Puede obtener acceso a estos recursos en tiempo de ejecución a través de la clase de ensamblado del espacio de nombres System.Reflection .

Una ventaja importante de incrustar recursos en el manifiesto es que puesto que los archivos forman parte de su ensamblado compilado, el usuario no puede accidentalmente eliminar o pierde los archivos críticos para la aplicación, que en algunos casos, puede evitar la ejecución del programa. Una limitación de este enfoque es que no puede guardar los cambios en este archivo al ensamblado sin volver a compilar el programa. A causa de esto, sólo incluyen archivos que no cambiarán durante la duración de la aplicación como recurso incrustado.

Demostración paso a paso

Para agregar los recursos incrustados a su proyecto, primero debe agregar los archivos como parte de su proyecto. Cuando haya agregado los archivos al proyecto, puede tener acceso y mostrar los recursos mediante el espacio de nombres System.Reflection .

Agregar recursos incrustados

Para agregar un archivo de texto y un archivo de imagen a su proyecto como recursos incrustados, siga estos pasos:
  1. Cree un nuevo proyecto de aplicación para Windows para esta demostración. Este formulario se utiliza para mostrar los recursos que se tiene acceso desde el ensamblado en ejecución durante el tiempo de ejecución.
  2. Haga clic con el botón secundario del mouse en el nombre del proyecto, haga clic en Agregar y, a continuación, haga clic en Agregar nuevo elemento .
  3. En el cuadro de diálogo Nuevo elemento , seleccione Archivo de texto en el menú y nombre del archivo MyTextFile.txt. Cuando el archivo se abre en el entorno de desarrollo integrado (IDE), agregar texto y, a continuación, cierre el archivo.
  4. Repita los pasos 1 y 2 para agregar una imagen de mapa de bits a su proyecto, pero en lugar de seleccionar Archivo de texto como el nuevo tipo de elemento, seleccione Archivo de mapa de bits y, a continuación, cambie el nombre del archivo MyImage.bmp . Cuando se abre la nueva imagen en el IDE, dibujar algo en la imagen y, a continuación, cierre el archivo.
  5. Haga clic en el archivo de texto o en el mapa de bits y, a continuación, seleccione Propiedades .
  6. En el cuadro de diálogo Propiedades , busque la propiedad Acción de generación . De forma predeterminada, esta propiedad se establece en contenido . Haga clic en la propiedad y cambie la propiedad Generar acción a Recurso incrustado .
  7. Repita los pasos 4 y 5 para el otro archivo.
La próxima vez que genere el proyecto, el compilador agrega estos archivos al ensamblado. El compilador agrega el espacio de nombres raíz del proyecto al nombre del recurso cuando se incluye en el proyecto. Por ejemplo, si el espacio de nombres del proyecto raíz es MyNamespace, los recursos se denominan MyNamespace.MyTextFile.txt y MyNamespace.MyImage.bmp.

Nota Los nombres de archivo de recursos son distingue entre mayúsculas y minúsculas. Cuando tiene acceso a los recursos, debe utilizar la ortografía exacta y escrito el nombre de archivo. Si no utiliza la ortografía exacta y nombre de archivo, la llamada de método para obtener acceso a la ManifestResourceStream devuelve Nothing y el sistema no provoca una excepción.

Nota Si desea comprobar los nombres de recurso, puede utilizar Microsoft Intermediate Language Disassembler (ILDASM) para ver los datos de manifiestos, que enumera los recursos incluidos.

Acceso a los recursos

Para tener acceso a los recursos que han incrustado en el manifiesto del ensamblado, importar el System.IO y los espacios de nombres System.Reflection , como sigue:
   Imports System.IO
   Imports System.Reflection
				
el espacio de nombres System.IO proporciona la definición de una secuencia y el espacio de nombres System.Reflection define la clase de ensamblado que proporciona métodos de acceso a los recursos que están incrustados en el ensamblado.

Cuando declara lo siguiente en el área de declaración general, los recursos desde el ensamblado se leen cuando se carga el formulario:
   Dim _imageStream As Stream
   Dim _textStreamReader As StreamReader
   Dim _assembly As [Assembly]
				
Nota para tener acceso al evento Load del formulario en el Editor de código, haga doble clic en el formulario en el Editor de diseño.

Para leer el recurso desde el ensamblado que se está ejecutando el código actual, debe obtener una instancia de ese ensamblado. Para ello, utilice el método GetExecutingAssembly del ensamblado, como sigue:
   _assembly = [Assembly].GetExecutingAssembly()
				
leer la información del recurso en una secuencia se realiza con una llamada de método a GetManifestResourceStream . El parámetro que se pasa a este método es el nombre del recurso que se puede tener acceso a. Los dos recursos, a continuación, se leen en sus secuencias correspondientes cuando se ejecuta el evento Load del formulario.
   _imageStream =  _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp")
   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"))
				
el código del evento Load del formulario similar al siguiente:
   Try
      _assembly = [Assembly].GetExecutingAssembly()
      _imageStream =  _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp")
      _textStreamReader = New StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"))
   Catch ex As Exception
      MessageBox.Show("Resource wasn't found!", "Error")
   End Try
				
la instrucción Try-Catch , conocida como control de errores estructurado en. NET, se utiliza para detectar los errores que se hayan producido mientras la instancia de la clase del ensamblado tiene acceso a los recursos.

Mostrar recursos

En este ejemplo utiliza dos botones para mostrar los recursos incrustados. Al hacer clic en el primer botón, una imagen de mapa de bits que se basa en el recurso que se lee desde el ensamblado se creará y aparecerá en el control PictureBox del formulario. El segundo botón, se lee un recurso de texto y muestra el texto en un cuadro de texto.

Para mostrar los recursos incrustados, siga estos pasos:
  1. Agregue un control PictureBox al formulario.
  2. Agregar un nuevo control de botón al formulario y, a continuación, cambie su propiedad Text para Mostrar imagen .
  3. Haga doble clic en el botón para abrir su evento Click en el Visor de código y, a continuación, pegue el código siguiente en este evento:
       Try
          PictureBox1.Image = New Bitmap(_imageStream)
       Catch ex As Exception
          MessageBox.Show("Image Couldn't be created !")
       End Try
    					
    este código genera una nueva instancia de un mapa de bits que se basa en la secuencia de recursos que se leyó en el evento Load del formulario.

  4. Agregue un control TextBox al formulario.
  5. Agregue otro control Button al formulario y cambie su propiedad Text para Obtener el texto .
  6. Haga doble clic en el botón en el Editor de diseño para abrir el Click_Event para el botón y, a continuación, pegue el código siguiente en el evento:
       Try
          If _textStreamReader.Peek() <> -1 Then
             TextBox1.Text = _textStreamReader.ReadLine()
          End If
       Catch ex As Exception
          MessageBox.Show("Error reading stream!")
       End Try
    					
    este código determina si todavía existen caracteres que se va a leer en la secuencia. Si se encuentran caracteres, se lee una línea en el cuadro de texto.
  7. Presione F5 para ejecutar la aplicación.

Código completo

   Imports System.IO
   Imports System.Reflection

   Public Class Form1
      Inherits System.Windows.Forms.Form

   #Region " Windows Form Designer generated code "

      Public Sub New()
         MyBase.New()

         'This call is required by the Windows Form Designer.
         InitializeComponent()
 
         'Add any initialization after the InitializeComponent() call.
      End Sub

      'Form overrides dispose to clean up the component list.
      Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
         If disposing Then
            If Not (components Is Nothing) Then
               components.Dispose()
            End If
         End If
         MyBase.Dispose(disposing)
      End Sub

      'Required by the Windows Form Designer.
      Private components As System.ComponentModel.IContainer
 
      'NOTE: The following procedure is required by the Windows Form Designer.
      'It can be modified using the Windows Form Designer.  
      'Do not modify it using the code editor.
      Friend WithEvents Button1 As System.Windows.Forms.Button
      Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
      Friend WithEvents Button2 As System.Windows.Forms.Button
      Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
      <System.Diagnostics.DebuggerStepThrough()> Private Sub  InitializeComponent()
         Me.Button1 = New System.Windows.Forms.Button()
         Me.PictureBox1 = New System.Windows.Forms.PictureBox()
         Me.Button2 = New System.Windows.Forms.Button()
         Me.TextBox1 = New System.Windows.Forms.TextBox()
         Me.SuspendLayout()
         '
         'Button1
         '
         Me.Button1.Location = New System.Drawing.Point(16, 196)
         Me.Button1.Name = "Button1"
         Me.Button1.TabIndex = 0
         Me.Button1.Text = "Show Image"
         '
         'PictureBox1
         '
         Me.PictureBox1.Location = New System.Drawing.Point(8, 8)
         Me.PictureBox1.Name = "PictureBox1"
         Me.PictureBox1.Size = New System.Drawing.Size(280, 184)
         Me.PictureBox1.TabIndex = 1
         Me.PictureBox1.TabStop = False
         '
         'Button2
         '
         Me.Button2.Location = New System.Drawing.Point(16, 232)
         Me.Button2.Name = "Button2"
         Me.Button2.TabIndex = 2
         Me.Button2.Text = "Get Text"
         '
         'TextBox1
         '
         Me.TextBox1.Location = New System.Drawing.Point(100, 232)
         Me.TextBox1.Name = "TextBox1"
         Me.TextBox1.Size = New System.Drawing.Size(176, 20)
         Me.TextBox1.TabIndex = 3
         Me.TextBox1.Text = "TextBox1"
         '
         'Form1
         '
         Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
         Me.ClientSize = New System.Drawing.Size(292, 266)
         Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.TextBox1, Me.Button2, Me.PictureBox1, Me.Button1})
         Me.Name = "Form1"
         Me.Text = "Form1"
         Me.ResumeLayout(False)

      End Sub

   #End Region

      Dim _imageStream As Stream
      Dim _textStreamReader As StreamReader
      Dim _assembly As [Assembly]

      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         Try
            _assembly = [Assembly].GetExecutingAssembly()
            _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp")
            _textStreamReader = New StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"))
         Catch ex As Exception
            MessageBox.Show("Resource wasn't found!", "Error")
         End Try
      End Sub

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         Try
            PictureBox1.Image = New Bitmap(_imageStream)
         Catch ex As Exception
            MessageBox.Show("Image Couldn't be created !")
         End Try
      End Sub

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
         Try
            If _textStreamReader.Peek() <> -1 Then
               TextBox1.Text = _textStreamReader.ReadLine()
            End If
         Catch ex As Exception
            MessageBox.Show("Error reading stream!")
         End Try
      End Sub
   End Class
				
Nota El código debe cambiarse en Visual Basic 2005. Si crea un nuevo formulario que se denomina Form1 en Visual Basic 2005, se crea un archivo Form1.vb para el código y se crea un archivo Form1.Designer.vb que contiene la parte generada automáticamente. Los formularios Windows Forms Designer utiliza la palabra clave partial para dividir la implementación de Form1 en dos archivos independientes. Esto impide que el código emitido por diseñador están intercalados con el código.

Para obtener más información acerca de las nuevas mejoras del lenguaje Visual Basic 2005, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx

Para obtener más información acerca de las clases parciales y el Diseñador de Windows Forms, visite el siguiente sitio Web de MSDN:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

Solución de problemas

Como los nombres de los recursos son distingue entre mayúsculas y minúsculas, compruebe que está utilizando la ortografía correcta y el caso de los recursos que se tiene acceso. Puede utilizar ILDASM para leer los datos para comprobar la ortografía exacta de los recursos de manifiestos.

Referencias

Para obtener más información, consulte los sitios Web de Microsoft Developer Network (MSDN) siguientes:
Espacio de nombres System.Reflection
http://msdn2.microsoft.com/en-us/library/system.reflection(vs.71).aspx

Clase de ensamblado
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly(vs.71).aspx

Método Assembly.GetManifestResourceStream
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.getmanifestresourcestream(vs.71).aspx

Propiedades

Id. de artículo: 319291 - Última revisión: miércoles, 16 de mayo de 2007 - Versión: 2.8
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic 2005
Palabras clave: 
kbmt kbvs2005swept kbvs2005applies kbhowtomaster KB319291 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 319291

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com