Como incorporar e acessar recursos usando o Visual C++ .NET ou Visual C++ 2005

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 816181
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 319291.
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 319292 .


Este artigo se refere ao seguinte namespace Microsoft .NET Framework Class Library:
  • System::IO
  • System::Reflection
  • System::ComponentModel
  • System::Collections
  • System::Windows::Forms
  • System:: data
  • System::Drawing

NESTA TAREFA

Sumário
Este artigo passo a passo descreve como usar o Microsoft Visual C++ .NET ou Microsoft Visual C++ 2005 para incorporar recursos como parte do assembly e, em seguida, como acessar esses recursos em tempo de execução.

back to the top

Visão geral

O .NET Framework pode encapsular arquivos como parte de um assembly compilado. Esses arquivos são conhecidos como recursos incorporados. Esses recursos são completamente separados dos arquivos .rc e os arquivos .resx que são associados com o assembly. Você pode acessar esses recursos em tempo de execução através da classe de assembly do namespace System.Reflection .

Uma grande vantagem de incorporar recursos para o manifesto é que como os arquivos são parte do seu assembly compilado, o usuário não pode acidentalmente excluir ou substitua arquivos que são críticas para o seu programa e que, às vezes, pode impedir a execução do programa. Uma limitação dessa abordagem é que você não pode salvar alterações neste arquivo para o assembly sem recompilar o programa. Devido a essa limitação, inclui apenas esses arquivos não serão alterados durante o tempo de vida de seu programa como um recurso incorporado.

back to the top

Incorporar e, em seguida, acessar recursos

Para adicionar recursos incorporados ao seu projeto, primeiro você deve adicionar os arquivos como parte do seu projeto. Após ter adicionado os arquivos para seu projeto, você pode acessar e exibir os recursos por meio do namespace System.Reflection .

back to the top

Adicionar recursos incorporados

Para adicionar um arquivo de texto e um arquivo de imagem para seu projeto como recursos incorporados, execute as seguintes etapas:
  1. Inicie o Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Windows Forms Application (. NET) em modelos .

    Observação No Visual Studio 2005, clique em Visual C++ em Tipos de projeto e, em seguida, clique em Windows Forms Application em modelos .
  4. Na caixa nome , digite MyApplication e, em seguida, clique em OK .
  5. No Solution Explorer, clique com o botão direito do mouse MyApplication , aponte para Add e, em seguida, clique em Add New Item .
  6. Na caixa de diálogo Add New Item , em modelos , clique em Arquivo de texto (.txt) .
  7. Nomeie o arquivo como MyTextFile.txt e, em seguida, clique em Abrir .

    Observação No Visual Studio 2005, clique em Adicionar .
  8. Quando o arquivo é aberto no editor, adicione algum texto para o arquivo de texto.
  9. Salve e feche o arquivo.
  10. Repita as etapas 5 e 6 para adicionar uma imagem de bitmap para seu projeto, mas em vez de clicar em Arquivo de texto (.txt) , clique em Arquivo de bitmap (.bmp) e, em seguida, alterar o nome do arquivo para MyImage.bmp.
  11. Quando a nova imagem for aberta no editor, desenhe algo na imagem.
  12. Salve e feche o arquivo.
  13. No Solution Explorer, clique com o botão direito do mouse MyApplication e, em seguida, clique em Propriedades .
  14. Na caixa de diálogo MyApplication Property Pages , expanda vinculador e, em seguida, clique em entrada .
  15. No campo Incorporar arquivo de recurso gerenciado , digite os nomes de arquivo que você adicionou recentemente para o projeto. Por exemplo, você pode digitar MyTextFile.txt; MyImage.bmp .

    Na próxima vez que você criar o projeto, o compilador adiciona esses arquivos ao seu assembly.
  16. Clique em OK .
Observação Os nomes de arquivo de recurso são diferencia maiúsculas de minúsculas. Quando você acessa os recursos, você deve usar a ortografia exata e o caso do nome do arquivo. Se você não usar exatamente a ortografia e caso do nome de arquivo, a chamada do método para acessar o fluxo ManifestResourceStream retorna NULL e o sistema não gera uma exceção.

Se você deseja verificar os nomes dos recursos, você poderá usar o Microsoft intermediate language (MSIL) Desassemblador (ILDASM.exe) para exibir os dados manifesto. O Manifesto dados lista os recursos incluídos.

back to the top

Acessar os recursos

Para acessar os recursos que você tenha incorporado no manifesto do assembly, execute estas etapas:
  1. Importe os namespaces System::Reflection e System::IO . Para fazer isso, adicione o seguinte código no Editor de código após as outras diretivas usando :
    using namespace System::IO;using namespace System::Reflection;
    O espaço para nome System::IO fornece a definição de um fluxo e o namespace System::Reflection define a classe do assembly que fornece métodos para acessar os recursos são incorporados em seu assembly.
  2. Declarar o membro seguintes variáveis na classe Form1 :
    private: Assembly *_assembly;private: Stream *_imageStream;private: StreamReader *_textStreamReader;
  3. Para acessar o evento Load para o formulário no Editor de código, clique duas vezes o formulário no modo de design.
  4. Para ler o recurso do assembly que está executando o código atual, você deve obter uma instância do assembly. Para fazer isso, use o método GetExecutingAssembly do assembly no manipulador de eventos Form1_Load , da seguinte maneira:
    _assembly = Assembly::GetExecutingAssembly();
  5. Ler as informações do recurso para um fluxo é executada com uma chamada de método para o método GetManifestResourceStream . O parâmetro que é passado para esse método é o nome do recurso que deve ser acessado. Os dois recursos, em seguida, são lidos para seus fluxos correspondentes como o evento Load do formulário é executado. Para fazer isso, adicione o seguinte código ao manipulador de eventos Form1_Load :
    _imageStream = _assembly->GetManifestResourceStream(S"MyImage.bmp");_textStreamReader = new StreamReader(_assembly->GetManifestResourceStream(S"MyTextFile.txt"));
  6. Configurar um mecanismo de tratamento de exceção para o código no manipulador de eventos Form1_Load usando os blocos catch e tente da seguinte maneira: tente
    try{    _assembly = Assembly::GetExecutingAssembly();    _imageStream = _assembly->GetManifestResourceStream(S"MyImage.bmp");    _textStreamReader = new StreamReader(_assembly->GetManifestResourceStream(S"MyTextFile.txt"));}catch(Exception *ex){    MessageBox::Show("Error accessing resources!",ex->Message);}
    o bloco try-catch , conhecido como erro estruturado manipulação no Visual C++. NET, é usado para capturar quaisquer erros que possam ter ocorrido enquanto a instância da classe assembly acessa os recursos.
back to the top

Exibir os recursos

Este exemplo usa dois controles Button para exibir os recursos incorporados. Quando você clica no primeiro botão, uma imagem de bitmap que se baseia o recurso que é lido do assembly é criada e exibe no controle PictureBox do formulário. Quando você clica no botão segundo, o texto é lido de um recurso de texto e exibe o texto em uma caixa de texto.

Para exibir os recursos incorporados, execute estas etapas:
  1. Adicione um controle PictureBox ao formulário.
  2. Adicionar um controle Button ao formulário e altere sua propriedade Text para Show Image .
  3. Clique duas vezes em Mostrar imagem para abrir o evento Click no Visualizador de código e cole o código a seguir no manipulador de eventos: tente
    try{    pictureBox1->Image = new Bitmap(_imageStream);}catch(Exception *ex){    MessageBox::Show("Error creating image!",ex->Message); }
    esse código gera uma nova instância de um bitmap que se baseia o fluxo de recurso que foi lido no evento Load do formulário.
  4. Alterne para modo de design e, em seguida, adicione um controle TextBox ao formulário.
  5. Adicione outro controle de botão ao formulário e, em seguida, alterar sua propriedade Text para Obter texto .
  6. Clique duas vezes em Obter texto para abrir o evento Click do botão e cole o código a seguir no manipulador de eventos: tente
    try{    if(_textStreamReader->Peek() != 1)     {        textBox1->Text = _textStreamReader->ReadLine();    }}catch(Exception *ex){    MessageBox::Show("Error writing text!",ex->Message); }
  7. Pressione CTRL+N para criar a solução.
  8. Pressione CTRL+F5 para executar o programa.
back to the top

Código completo

#pragma oncenamespace MyApplication{    using namespace System;    using namespace System::ComponentModel;    using namespace System::Collections;    using namespace System::Windows::Forms;    using namespace System::Data;    using namespace System::Drawing;    using namespace System::IO;    using namespace System::Reflection;    /// <summary>     /// Summary for Form1    ///    /// WARNING: If you change the name of this class, you will need to change the     ///          'Resource File Name' property for the managed resource compiler tool     ///          associated with all .resx files this class depends on.  Otherwise,    ///          the designers will not be able to interact properly with localized    ///          resources associated with this form.    /// </summary>    public __gc class Form1 : public System::Windows::Forms::Form    {       private: Assembly *_assembly;    private: Stream *_imageStream;    private: StreamReader *_textStreamReader;    private: System::Windows::Forms::PictureBox *  pictureBox1;    private: System::Windows::Forms::Button*  button1;    private: System::Windows::Forms::TextBox*  textBox1;    private: System::Windows::Forms::Button*  button2;        public:        Form1(void)        {            InitializeComponent();        }      protected:        void Dispose(Boolean disposing)        {            if (disposing && components)            {                components->Dispose();            }            __super::Dispose(disposing);        }    private:        /// <summary>        /// Required designer variable.        /// </summary>        System::ComponentModel::Container * components;        /// <summary>        /// Required method for Designer support - do not modify        /// the contents of this method with the code editor.        /// </summary>        void InitializeComponent(void)        {            this->pictureBox1 = new System::Windows::Forms::PictureBox();            this->button1 = new System::Windows::Forms::Button();            this->textBox1 = new System::Windows::Forms::TextBox();            this->button2 = new System::Windows::Forms::Button();            this->SuspendLayout();            //             // pictureBox1            //             this->pictureBox1->Location = System::Drawing::Point(8, 8);            this->pictureBox1->Name = S"pictureBox1";            this->pictureBox1->Size = System::Drawing::Size(280, 152);            this->pictureBox1->TabIndex = 0;            this->pictureBox1->TabStop = false;            //             // button1            //             this->button1->Location = System::Drawing::Point(8, 184);            this->button1->Name = S"button1";            this->button1->TabIndex = 1;            this->button1->Text = S"Show Image";            this->button1->Click += new System::EventHandler(this, button1_Click);            //             // textBox1            //             this->textBox1->Location = System::Drawing::Point(96, 224);            this->textBox1->Name = S"textBox1";            this->textBox1->Size = System::Drawing::Size(184, 20);            this->textBox1->TabIndex = 2;            this->textBox1->Text = S"textBox1";            //             // button2            //             this->button2->Location = System::Drawing::Point(8, 224);            this->button2->Name = S"button2";            this->button2->TabIndex = 3;            this->button2->Text = S"Get Text";            this->button2->Click += new System::EventHandler(this, button2_Click);            //             // Form1            //             this->AutoScaleBaseSize = System::Drawing::Size(5, 13);            this->ClientSize = System::Drawing::Size(292, 266);            this->Controls->Add(this->button2);            this->Controls->Add(this->textBox1);            this->Controls->Add(this->button1);            this->Controls->Add(this->pictureBox1);            this->Name = S"Form1";            this->Text = S"Form1";            this->Load += new System::EventHandler(this, Form1_Load);            this->ResumeLayout(false);        }       private: System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)             {                try                {                    _assembly = Assembly::GetExecutingAssembly();                    _imageStream = _assembly->GetManifestResourceStream(S"MyImage.bmp");                    _textStreamReader = new StreamReader(_assembly->GetManifestResourceStream(S"MyTextFile.txt"));                }                catch(Exception *ex)                {                    MessageBox::Show("Error accessing resources!",ex->Message);                }             }    private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)             {                try                {                    pictureBox1->Image = new Bitmap(_imageStream);                }                catch(Exception *ex)                {                    MessageBox::Show("Error creating image!",ex->Message);                 }             }    private: System::Void button2_Click(System::Object *  sender, System::EventArgs *  e)             {                try                {                    if(_textStreamReader->Peek() != 1)                     {                        textBox1->Text = _textStreamReader->ReadLine();                    }                }                catch(Exception *ex)                {                    MessageBox::Show("Error writing text!",ex->Message);                 }             }};}
Observação Você deve adicionar a opção de compilador de suporte de tempo de execução idioma comum (/ CLR: oldSyntax) no Visual C++ 2005 a compilar com êxito o exemplo de código anterior.
Para adicionar a opção de compilador de suporte de tempo de execução idioma comum no Visual C++ 2005, siga estas etapas:
  1. Clique em Project e clique em <projectname> propriedades .

    Observação <projectname> é um espaço reservado para o nome do projeto.
  2. Expanda Configuration Properties e, em seguida, clique em Geral .
  3. Clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) no projeto oferece suporte a Common Language Runtime definindo no painel à direita, clique em Aplicar e em seguida, clique em OK .
Para obter mais informações sobre o common language runtime oferece suporte às opções de compilador, visite o seguinte site da Microsoft Developer Network (MSDN):
/CLR (common Language Runtime Compilation)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
back to the top

Solução de problemas

Como os nomes de recursos são diferencia maiúsculas de minúsculas, verifique se você está usando a ortografia correta e caso dos recursos que são acessados. Para verificar a ortografia exata dos recursos, use a ferramenta ILDASM.exe para ler os dados manifesto.

back to the top

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 816181 - Última Revisão: 05/16/2007 06:15:50 - Revisão: 2.4

Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft .NET Framework 1.1, Microsoft Visual C++ 2005 Express Edition

  • kbmt kbbitmap kbwindowsforms kbresource kbhowtomaster KB816181 KbMtpt
Comentários