Como incorporar e aceder a recursos utilizando o Visual C#

Traduções de Artigos Traduções de Artigos
Artigo: 319292 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo descreve como utilizar o Visual C# para incorporar recursos como parte da assemblagem e, em seguida, aceder aos recursos em tempo de execução.

Descrição geral

O .NET Framework pode encapsular ficheiros como parte de uma assemblagem compilada. Estes ficheiros são conhecidos como recursos incorporados. Estes recursos são completamente independentes dos ficheiros .resources e .resx que estão associados a assemblagem. Pode aceder a estes recursos em tempo de execução através da classe assemblagem do espaço de nomes System.Reflection .

Uma vantagem principal de incorporação de recursos para o manifesto é que porque os ficheiros forem parte a assemblagem compilada, o utilizador não é possível acidentalmente eliminar ou misplace ficheiros que são críticos para a aplicação, que, em alguns casos, poderá impedir a execução do programa. Uma limitação desta abordagem é que não é possível guardar as alterações a este ficheiro à assemblagem sem recompilar o programa. Deste modo, só incluem ficheiros que não serão alterados durante o tempo de vida da aplicação como um recurso incorporado.

Demonstração passo a passo

Para adicionar recursos incorporados ao projecto, tem de adicionar os ficheiros como parte do projecto. Depois de ter adicionado os ficheiros ao projecto, pode aceder e apresentar os recursos no espaço de nomes de System.Reflection .

Adicionar recursos incorporados

Para adicionar um ficheiro de texto e um ficheiro de imagem ao projecto como recursos incorporados, siga estes passos:
  1. Crie um novo projecto de aplicação do Windows para esta demonstração. Este formulário é utilizado para apresentar os recursos que são acedidos a partir da assemblagem executar durante a execução.
  2. Clique com o botão direito do rato o nome do projecto, clique em Adicionar e, em seguida, clique em Adicionar novo item .
  3. Na caixa de diálogo Novo Item , seleccione o Ficheiro de texto a partir do menu e, atribua um nome ao ficheiro MyTextFile.txt. Quando abre o ficheiro no ambiente de desenvolvimento integrado (IDE), adicione algum texto e, em seguida, feche o ficheiro.
  4. Repita os passos 1 e 2 para adicionar uma imagem de mapa de bits para o projecto, mas em vez de seleccionar o Ficheiro de texto como o novo tipo de item, seleccione o Ficheiro de mapa de bits e, em seguida, altere o nome do ficheiro para MyImage.bmp . Quando a nova imagem é aberta no IDE do, desenhe algo a imagem e, em seguida, feche o ficheiro.
  5. Clique com o botão direito do rato no ficheiro de texto ou o mapa de bits e, em seguida, seleccione Propriedades .
  6. Na caixa de diálogo Propriedades , localize a propriedade ' Criar Acção . Por predefinição, esta propriedade é definida para o conteúdo . Clique na propriedade e altere a propriedade ' Criar Acção para Recursos incorporados .
  7. Repita os passos 4 e 5 para o outro ficheiro.
Da próxima vez que cria o projecto, o compilador adiciona estes ficheiros para a assemblagem. O compilador adiciona espaço de nomes root do projecto ao nome do recurso quando está incluído no projecto. Por exemplo, se o espaço de nomes raiz do projecto for MyNamespace, os recursos são denominados MyNamespace.MyTextFile.txt e MyNamespace.MyImage.bmp.

Nota : os nomes de ficheiro recurso são sensíveis a maiúsculas e minúsculas. Quando acede os recursos, tem de utilizar a ortografia exacta e o caso do nome do ficheiro. Se não utilizar a ortografia exacta e caso do nome do ficheiro, a chamada de método para aceder a ManifestResourceStream devolve nada e o sistema não acciona uma excepção.

Nota : Se pretender verificar se os nomes de recursos, pode utilizar o ILDASM (intermédio idioma desintegrador) Microsoft para ver os manifesto dados, que lista os recursos incluídos.

Recursos de acesso

Para aceder aos recursos que incorporado para o manifesto da assemblagem a, importe System.IO e espaços de nomes System.Reflection , da seguinte forma:
   using System.IO;
   using System.Reflection;
				
o espaço de nomes System.IO fornece a definição de uma transmissão em sequência e o espaço de nomes System.Reflection define a classe de assemblagem fornece métodos para aceder os recursos que estão incorporados a assemblagem.

Quando declara o seguinte na área de declaração geral, os recursos da assemblagem são lidas quando o formulário é carregado:
   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;
				
Nota : para o evento carregar do formulário no Editor de códigos de acesso, faça duplo clique no formulário no Editor de estrutura.

Para ler o recurso da assemblagem que está a executar o código actual, tem de obter uma instância dessa assemblagem. Para tal, utilize o método GetExecutingAssembly da assemblagem, da seguinte forma:
   _assembly = Assembly.GetExecutingAssembly();
				
ler as informações do recurso a uma transmissão em sequência é efectuada através de uma chamada de método para GetManifestResourceStream . O parâmetro que é transmitido para este método é o nome do recurso que está a ser acedido. Os dois recursos, em seguida, são lidos para as respectivas sequências correspondentes à medida que é executado o evento carregar do formulário.
   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");
   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
				
código no evento carregar para o formulário é semelhante o seguinte:
   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }
				
a instrução Try-Catch , conhecida como o processamento estruturado de erro no. NET, é utilizada para detectar quaisquer erros que possam ter ocorrido enquanto a instância da classe assemblagem acede os recursos.

Recursos de visualização

Este exemplo utiliza dois botões para apresentar os recursos incorporados. Quando clica o primeiro botão, uma imagem de mapa de bits que se baseia o recurso é de leitura da assemblagem é criada e apresentada no controlo PictureBox do formulário. O segundo botão lê a partir de um recurso de texto e apresenta o texto numa caixa de texto.

Para visualizar os recursos incorporados, siga estes passos:
  1. Adicione um controlo PictureBox ao formulário.
  2. Adicionar um novo controlo de botão ao formulário e, em seguida, altere a propriedade de texto para Mostrar a imagem .
  3. Faça duplo clique no botão para abrir o evento Click no Visualizador de código e, em seguida, cole o código seguinte neste caso:
       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }
    					
    este código gera uma nova instância de um mapa de bits que se baseia a sequência de recurso que foi lida no evento carregar do formulário.

  4. Adicione um controlo de caixa de texto ao formulário.
  5. Adicionar outro controlo de botão ao formulário e altere a propriedade de texto para Obter texto .
  6. Faça duplo clique no botão no Editor de estrutura para abrir o Click_Event do botão e, em seguida, cole o código seguinte no evento:
       try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }
    					
    este código determina se ainda existem caracteres a serem lidos na sequência. Se forem encontrados caracteres, uma linha é de leitura para a caixa de texto.

  7. Prima F5 para executar a aplicação.

Código completo

   using System;
   using System.Drawing;
   using System.Collections;
   using System.ComponentModel;
   using System.Windows.Forms;
   using System.Data;

   using System.IO;
   using System.Reflection;

   namespace MyNamespace
   {
      /// <summary>
      /// Summary description for Form1.
      /// </summary>
      public class Form1 : System.Windows.Forms.Form
      {
         private System.Windows.Forms.PictureBox pictureBox1;
         private System.Windows.Forms.TextBox textBox1;
         private System.Windows.Forms.Button button1;
         private System.Windows.Forms.Button button2;
         /// <summary>
         /// Required designer variable.
         /// </summary>
         private System.ComponentModel.Container components = null;

         public Form1()
         {
            // 
            // Required for Windows Form Designer support.
            // 
            InitializeComponent();

            // 
            // TODO: Add any constructor code after InitializeComponent call.
            // 
         }

         /// <summary>
         /// Clean up any resources being used.
         /// </summary>
         protected override void Dispose( bool disposing )
         {
            if( disposing )
            {
               if (components != null) 
               {
                  components.Dispose();
               }
            }
            base.Dispose( disposing );
         }

      #region Windows Form Designer generated code
         /// <summary>
         /// Required method for Designer support - do not modify
         /// the contents of this method with the code editor.
         /// </summary>
         private void InitializeComponent()
         {
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // pictureBox1
            // 
            this.pictureBox1.Location = new System.Drawing.Point(4, 8);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(284, 192);
            this.pictureBox1.TabIndex = 0;
            this.pictureBox1.TabStop = false;
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(92, 236);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(192, 20);
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "textBox1";
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(8, 208);
            this.button1.Name = "button1";
            this.button1.TabIndex = 2;
            this.button1.Text = "Show Image";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(8, 236);
            this.button2.Name = "button2";
            this.button2.TabIndex = 3;
            this.button2.Text = "Get Text";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.AddRange(new System.Windows.Forms.Control[]{
                                                                     this.button2,
                                                                     this.button1,
                                                                     this.textBox1,
                                                                     this.pictureBox1});

            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
         }
      #endregion

         Assembly _assembly;
         Stream _imageStream;
         StreamReader _textStreamReader;

         /// <summary>
         /// The main entry point for the application.
         /// </summary>
         [STAThread]
         static void Main() 
         {
            Application.Run(new Form1());
         }

         private void Form1_Load(object sender, System.EventArgs e)
         {
            try
            {
               _assembly = Assembly.GetExecutingAssembly();
               _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
              _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
            }
            catch
            {
               MessageBox.Show("Error accessing resources!");
            }		
         }

         private void button1_Click(object sender, System.EventArgs e)
         {
            try
            {
               pictureBox1.Image = new Bitmap(_imageStream);
            }
            catch 
            {
               MessageBox.Show("Error creating image!");
            }
         }

         private void button2_Click(object sender, System.EventArgs e)
         {
            try
            {
               if(_textStreamReader.Peek() != -1)
               {
                  textBox1.Text = _textStreamReader.ReadLine();
               }
            }
            catch
            {
               MessageBox.Show("Error writing text!");
            }		
         }
      }
   }
				
Nota O código deve ser alterado no Visual Studio 2005 ou no Visual Studio 2008. Quando cria um projecto de Windows Forms, Visual C# adiciona um formulário ao projecto por predefinição. Este formulário é denominado Form1. Os dois ficheiros que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever o código no Form1.cs. O ficheiro Designer.cs é onde o Windows Forms Designer escreve o código que implementa todas as acções efectuadas, adicionando controlos. Para obter mais informações sobre o Windows Forms Designer no Visual C# 2005 ou no Visual Studio 2008, visite o seguinte Web site da Microsoft:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx

Resolução de problemas

Uma vez que os nomes dos recursos são sensíveis a maiúsculas e minúsculas, verifique se estão a utilizar a ortografia correcta e caso dos recursos que são acedidos. Pode utilizar ILDASM para ler os dados manifesto para verificar a ortografia exacta dos recursos.

Referências

Para mais informações, consulte os seguintes Web sites da Microsoft Developer Network (MSDN):
Espaço de nomes System.Reflection
http://msdn2.microsoft.com/en-us/library/system.reflection(vs.71).aspx

Classe de assemblagem
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

Propriedades

Artigo: 319292 - Última revisão: 15 de julho de 2008 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
Palavras-chave: 
kbmt kbsweptvs2008 kbhowtomaster KB319292 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 319292

Submeter comentários

 

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