André Alves de Lima

Talking about Software Development and more…

Trabalhando com arquivos de recursos no C# e VB.NET

Ao responder questões que recebo por e-mail ou quando tiro um tempinho para dar uma olhada nos fóruns da MSDN, tenho percebido ultimamente que muitos programadores .NET ainda não conhecem arquivos de recursos! Essa é uma funcionalidade tão útil quando estamos desenvolvendo aplicativos com o C# ou VB.NET e eu acho uma pena que tanta gente ainda não conheça ou não saiba utilizar. Pensando nessa deficiência, resolvi escrever este artigo detalhando como utilizar arquivos de recursos no C# e VB.NET.

O que são arquivos de recursos?

Primeiramente, antes de mostrar como podemos utiliza-los, vamos entender o que são os arquivos de recursos. Eles nada mais são do que arquivos que apontam para recursos (como strings, imagens, ícones, arquivos, etc.) que poderão ser utilizados na nossa aplicação. Esses arquivos têm a extensão “resx” e, na verdade, são um atalho para os arquivos físicos que ficam normalmente armazenados na pasta “Resources” do nosso projeto.

Onde ficam os arquivos de recursos?

Quando criamos um projeto desktop (Windows Forms ou WPF) com o C# ou VB.NET, o próprio Visual Studio já cria automaticamente um arquivo de recursos que podemos utilizar no projeto todo. No C#, esse arquivo fica armazenado dentro da seção “Properties” do “Solution Explorer“:

Já no VB.NET, o arquivo de recursos que é criado automaticamente pelo Visual Studio pode ser acessado na tela de propriedades do projeto:

Tipos de recursos suportados

Clicando no botão para escolha do tipo de recurso, percebemos que podemos adicionar praticamente qualquer coisa dentro do arquivo de recursos:

As opções vão desde strings, imagens e ícones até arquivos de mídia (sons e vídeos) ou qualquer outro tipo de arquivo (como PDFs, DOCs, etc). Tudo pode ser armazenado dentro do arquivo de recursos, caso necessário.

Adicionando novos recursos

Para adicionarmos novos recursos, basta clicarmos no botão “Add Resource” e escolher o tipo de recurso que queremos adicionar:

Na maior parte do tempo, vamos trabalhar principalmente com duas opções: nova string ou arquivo existente. Ao adicionarmos um arquivo existente, ele automaticamente será adicionado na categoria pertinente (quando adicionamos um arquivo “.bmp” pré-existente, ele será automaticamente adicionado na categoria “imagens“).

Além dessas opções, o Visual Studio também conta com um simples editor de imagens, ícones e arquivos de texto para criarmos novos recursos diretamente pelo Visual Studio (ao invés de selecionarmos um arquivo pré-existente).

Agora, imagine que temos uma string longa que será utilizada várias vezes no nosso sistema em diferentes lugares. Ao invés de digitarmos esse texto várias vezes diretamente nos controles, podemos adicionar essa string como um recurso que posteriormente poderá ser utilizado quantas vezes forem necessárias. Para adicionarmos uma nova string no arquivo de recursos, basta irmos até a seção de strings do arquivo de recursos e adicionarmos uma nova entrada na lista:

O código para acessarmos esse recurso através do código é um pouco diferente quando comparamos o C# com o VB.NET. No C#, acessamos o conteúdo do arquivo de recursos através do seu namespace (no caso do arquivo de recursos padrão, ele fica dentro de “Properties.Resources“). Já no VB.NET, acessamos os recursos através da propriedade “My.Resources“.

Para conferirmos essa utilização, vamos adicionar uma Label no nosso formulário e, no evento “Load” do formulário, vamos configurar o seu texto para a string que acabamos de criar:

        // C#
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = Properties.Resources.MinhaString;
        }
    ' VB.NET
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Label1.Text = My.Resources.MinhaString
    End Sub

Execute a aplicação e veja o resultado:

Trabalhando com imagens no arquivo de recursos

Da mesma forma que podemos adicionar strings nos arquivos de recursos, o processo para adicionarmos imagens também é muito fácil. Primeiramente, vamos escolher uma imagem para testarmos. Eu escolhi essa aqui no Pixabay (estou na “vibe” de bebês porque meu segundo filho nasceu há dois meses). Se quiser baixar diretamente aqui do meu site, clique aqui.

Uma vez baixado o arquivo para o seu computador, escolha a opção para adicionar um novo recurso através de um arquivo pré-existente e selecione a imagem que acabamos de baixar. Note que, após a inclusão do recurso, podemos alterar o nome do recurso:

Para facilitar a nossa vida, vamos renomear esse recurso, dando o nome de “Baby” para ele. Feito isso, vamos adicionar um PictureBox no nosso formulário e vamos clicar na opção “Choose Image“:

Agora, note que, dentro da tela “Choose Resource“, nós conseguimos encontrar a imagem que acabamos de adicionar no arquivo de recursos:

Caso quiséssemos, nós poderíamos acessar essa imagem via código também:

E outros tipos de arquivos, como PDF?

Como mencionei anteriormente, podemos adicionar qualquer tipo de arquivo dentro dos nossos arquivos de recursos. Quando o arquivo que está sendo adicionado não se enquadra em nenhuma das categorias pré-estabelecidas, ele simplesmente será adicionado como um “arquivo“. Por exemplo, se quisermos adicionar esse PDF no arquivo de recursos, poderemos acessá-lo como um array de bytes via código:

            // C#
            System.IO.File.WriteAllBytes("arquivo.pdf", Properties.Resources.pdf);
            System.Diagnostics.Process.Start("arquivo.pdf");
        ' VB.NET
        System.IO.File.WriteAllBytes("arquivo.pdf", My.Resources.pdf)
        System.Diagnostics.Process.Start("arquivo.pdf")

Criando outros arquivos de recursos

Nós não precisamos ficar limitados com o arquivo de recursos “padrão” que é criado automaticamente pelo Visual Studio. Através da opção “Add New Item” do nosso projeto, podemos adicionar outros arquivos de recursos (ou até mesmo em um outro projeto, como em uma “Class Library“):

Em seguida, para utilizarmos os recursos armazenados dentro desse outro arquivo, basta utilizarmos o nome completo do recurso (no C#) ou a propriedade “My.Resources” seguida do nome do arquivo de recursos (no VB.NET):

Atenção! Os recursos aumentam o tamanho do executável!

Uma coisa que devemos ficar atentos é que todos os arquivos adicionados nos arquivos de recursos do nosso projeto serão compilados juntamente com a aplicação (ou com a biblioteca, se os arquivos de recursos estiverem armazenados dentro de uma dll). Dessa forma, o tamanho do executável ou dll aumentará significativamente dependendo do tamanho dos itens que adicionarmos nos arquivos de recursos. Veja só o tamanho dessa simples aplicação de exemplo que criamos neste artigo:

E como funciona no WPF? E no MVC?

Tudo o que vimos neste artigo sobre arquivos de recursos não vale somente para o Windows Forms. O WPF se comporta exatamente da mesma maneira. E existem artigos mostrando como utilizar arquivos de recursos no Web Forms e no MVC.

Concluindo

Os arquivos de recursos, apesar de serem uma funcionalidade básica de aplicações desenvolvidas com o .NET Framework, é muitas vezes desconhecido pelos programadores desse tipo de aplicação. Eles ajudam muito na organização dos nossos projetos e é uma funcionalidade que todo programador deveria pelo menos conhecer.

Neste artigo você conferiu como utilizar o arquivo de recursos “padrão” que é criado automaticamente pelo Visual Studio nos projetos Windows Forms e WPF. Além disso, você conferiu também como adicionar outros arquivos de recursos no C# e VB.NET, além do que é criado automaticamente pelo Visual Studio. Por fim, você viu que devemos ficar atentos com o tamanho da aplicação, que terá um crescimento diretamente relacionado com o tamanho dos itens que adicionarmos nos arquivos de recursos.

E você? Utiliza arquivos de recursos nos seus projetos? Qual a sua opinião sobre eles? Aprova ou não aprova? Deixe as suas observações na caixa de comentários!

Por fim, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário logo abaixo.

Até a próxima!

André Lima

Newsletter do André Lima

* indicates required



Powered by MailChimp

16 thoughts on “Trabalhando com arquivos de recursos no C# e VB.NET

  • Edward Gómez disse:

    Buen día André,

    Como siempre muy buena y detallada tu explicación sobre el uso de recursos, por mi parte solo uso lo estrictamente necesario por la razón de un aumentar demasiado el tamaño de la aplicación, pero lo cierto es que el uso de recursos facilita en gran manera nuestra programación, vale la pena echar una mirada y aprovechar el uso de los recursos.

    • andrealveslima disse:

      Olá Edward, obrigado pelo comentário!

      Com certeza temos que ficar atentos com os arquivos de recursos porque eles aumentam mesmo o tamanho da aplicação.. Aqui na empresa onde eu trabalho nós costumamos separar os recursos em uma dll a parte, dessa forma podemos utilizá-los em todos os nossos projetos e somente essa dll fica com o tamanho “inflado” (as outras bibliotecas e executáveis ficam do tamanho original)..

      O mais interessante é a quantidade de pessoas que simplesmente não conhecem os arquivos de recursos.. Sem dúvida é uma funcionalidade que deve ser conhecida, pois pode facilitar muito a nossa vida em diversas situações, como você mesmo mencionou..

      Um grande abraço!
      André Lima

  • William disse:

    Cara, seu blog é muito bom, parabéns! Em relação ao artigo, sempre uso “resources” quando evitar problemas quando vou dar publish no projeto. (Ex: Uso um arquivo txt como resource para utilizá-lo num StreamReader/StringReader ao invés do endereço do .txt da pasta) Além de pensar que os “resources” são bem práticos de manipular.

    Abraços.

    • andrealveslima disse:

      Olá William!

      Muito obrigado pelo elogio! Fico feliz que você tenha gostando dos artigos..

      Quanto ao esquema dos arquivos de recursos, com certeza eles são muito práticos.. É incrível como tem tanta gente que não sabe como é que eles funcionam! Foi por isso que eu resolvi escrever esse artigo sobre esse tema..

      Um grande abraço!
      André Lima

  • fernando lima disse:

    Bastante útil…minha biblioteca sofreu um dano inesperado qdo tentei remover um item e o projeto inteiro foi perdido, só consegui rodar de novo depois de copiar os arquivos correspondentes do backup, mas ainda assim ficou danificado….
    Queria saber uma coisa que não vi, se eu uso por exemplo icones personalizados, armazenados no resources, e faço uso deles em todos os forms, isso é melhor do que importar cada um de cada form de um recurso externo, ou o uso dos arquivos do resource vai me poupar espaço?

    • andrealveslima disse:

      Olá Fernando, obrigado pelo comentário!

      Se você está utilizando as mesmas imagens em vários formulários, com certeza vale a pena utilizar um arquivo de recursos único.. Do contrário (caso você importe as imagens em cada um dos formulários), as imagens serão importadas uma vez para cada formulário..

      Não sei se você sabe, mas todo formulário tem o seu próprio arquivo de recursos (se você expandir o nó do formulário no Solution Explorer você verá que o formulário tem um arquivo filho com a extensão .resx).. Ao importar recursos externos no formulário, eles são armazenados nesse arquivo de recursos local do formulário.. Ou seja, nesse caso a sua biblioteca/executável ficaria muito maior / mais carregada..

      Abraço!
      André Lima

      • Olá André,

        Eu tenho uma dúvida.
        Dentro da minha Solution, eu tenho 5 projetos, num desses projetos (dll) eu coloquei todas as imagens utilizadas nos formulários, ou seja, uma dll só para resources.

        Apesar de fazer referencia, no projeto “FrontEnd”, às imagens que estão na dll dessa forma:
        this.bt_Salvar.Image = global::RecGer.Properties.Resources.add;

        após compilar fica assim:
        this.bt_Salvar.Image = ((System.Drawing.Image)(resources.GetObject(“bt_Salvar.Image”)));

        Há algum tempo eu notei mesmo que no resource de cada formulário, estão lá as imagens.

        Minha dúvida é: Essas imagens no resource de cada formulário estão afetando o tamanho do EXE?
        Em caso positivo, o projeto que uso como resource está só gerando uma dll a mais para ser publicada no clickonce, né não?

        • andrealveslima disse:

          Olá Nelson!

          Desse jeito que você comentou, o conteúdo das imagens está sendo “embedado” no seu projeto front-end também.. Ou seja, você só está duplicando o tamanho do seu deployment desnecessariamente..

          Como é que você setou essa imagem no botão? Pelo designer (o código que está dentro de InitializeComponent) ou no code-behind? Normalmente o designer acaba se perdendo com esse tipo de coisa quando o recurso está em outro assembly..

          Abraço!
          André Lima

  • George Haydamus Neto disse:

    Olá, André.
    É possível preenchermos o arquivo de recurso .resx a partir do conteúdo que já tenho em XML?
    Agradeço pela atenção.
    George H.Neto

  • Rodrigo Silveira Neto Malagodi disse:

    André, boa noite. Meu projeto (Windows Forms) simplesmente começou a mostrar uma mensagem em 5 formulários, porém, não alterei nada nestes forms hoje. Adicionei uma linha de código em outro formulário não relacionado a estes, recompilei a solução, o programa executou normalmente e no encerramento da execução apareceu esse erro.
    A mensagem é a seguinte:
    “Couldn’t process file frmUsuario.resx due to its being in the Internet or Restricted zone or having the mark of the web on the file. Remove the mark of the web if you want to process these files.”

    Após isto o programa não recompila e não consigo resolver e nem descobrir o que pode ser.

    Por favor, me dê um help!

    • andrealveslima disse:

      Olá Rodrigo!

      Cara, vou ficar te devendo.. Nunca vi essa mensagem de erro e não consegui encontrar nada no Google.. Realmente estranho.. Você já tentou executar a aplicação em outro computador para ver se o erro também acontece?

      Abraço!
      André Lima

    • Vicente disse:

      Amigo,

      Eu tinha exatamente este problema. No meu caso, eu estava trabalhando com o projeto dentro de uma pasta do OneDrive e daí eu migrei para uma pasta normal do disco C:\Projetos, apaguei a pasta oculta .vs gerada abri o projeto e consegui recompilar normalmente. Talvez seja uma de tentar… abraço.

      • andrealveslima disse:

        Olá Vicente!

        Obrigado pela dica apresentada aqui para o Rodrigo.. Espero que ajude outras pessoas que passem por essa mesma situação..

        Abraço!
        André Lima

  • João Luiz disse:

    Complementando… Uma utilização prática do arquivo de recursos é para traduzir sistemas, ou seja, idealizar um sistema para que trabalhe com vários idiomas ao mesmo tempo.

    Eu já criei dei manutenção em alguns projetos no passado que exigiram sua tradução para 3 idiomas adicionais. E ai foi um trabalho enorme.

    Em projetos novos eu crio esses arquivos de recursos ou centralizo as mensagens em um único local, definindo o idioma. Se precisar traduzir, basta apenas incluir as mensagens correspondentes.

    • andrealveslima disse:

      Olá João!

      Sem sombra de dúvida, essa é uma perfeita utilização para arquivos de recursos.. Muito obrigado pelo complemento aqui..

      Abraço!
      André Lima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *