sexta-feira, 29 de abril de 2011

Carregando biblioteca no código com C#

Post curto porém útil hoje.
Ao menos do meu ponto de vista.

Eventualmente você quer rodar um software sem fazer uma instalação, certo?
Mas se você estiver usando uma biblioteca como você carrega essa biblioteca junto com o código do seu programa?
Bom. A solução que eu encontrei foi a seguinte, carregar a biblioteca com os recursos do meu projeto e escrevê-la no local onde o software é exetucado.
É bem simples.
Vejamos com um exemplo. Supondo que o nome da biblioteca seja minhaBiblioteca.dll.

Primeiro eu adiciono ela aos recursos do meu projeto, como um array de bytes
(opção Files, dentro de Resources.resx).
Não vou entrar em detalhes nesse post de como isso é feito, mas quem não souber como fazer pode dar uma olhada nesse outro post aqui.

Depois posso fazer o seguinte no construtor da minha Form1.cs.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MeuProjeto
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            if (!System.IO.File.Exists(Application.StartupPath + "\\minhaBiblioteca.dll"))
            {
                System.IO.File.WriteAllBytes(
                    Application.StartupPath + "\\minhaBiblioteca.dll", 
        global::MeuProjeto.Properties.Resources.minhaBiblioteca);
            }
        }
    }
}


É preciso ter cuidado ao fazer esse tipo de operação.
Se você não tiver permissão pra escrever arquivos no local onde o sofware estiver sendo executado, uma exceção será gerada.
Nesse caso, seria interessante colocar o if em uma estrutura try-catch. Não fiz isso porque, no meu caso, sei que ele não passará por esse problema, então seria código desnecessário.
Outro ponto importante de se ressaltar é que o arquivo, no caso do código acima, não foi apagado do sistema, então permanecerá lá mesmo após o software ter sido fechado.
É possível criar código para remover o arquivo do sistema, ou simplesmente deixar que o usuário remova-o manualmente se desejar.

[update]
Um dia desses estava fazendo algo semelhante a ideia desse post e pensei em postar aqui.
No caso acima eu usei o método System.IO.File.WriteAllBytes, pois se tratava de uma biblioteca. Há outros métodos de escrita dentro de System.IO.File que podem ser mais ou menos apropriados dependendo de com o que estás trabalhando.
Quando se carrega um arquivo xml, por exemplo, ele fica armazenado, nos Recursos, como texto. Era esse o meu caso: eu tinha um arquivo serializado xml que continha dados necessários para preencher uma lista do software, e então eu usei o método System.IO.File.WriteAllText para escrever o arquivo no local onde o programa é executado.
Nem vou colocar código porque é basicamente a mesma coisa do exemplo acima, apenas quis chamar atenção para a existência de diferentes métodos.
[/update]

Por enquanto era isso.
Qualquer dúvida é só comentar.

quarta-feira, 27 de abril de 2011

Adicionando arquivos aos recursos do projeto C#

O post de hoje será focado em como adicionar arquivos aos recursos do seu projeto, os quais ficam armazenados na Resources.resx e também em mostrar como usar estes arquivos adicionados.

Basicamente é possível adicionar arquivos de imagens, ícones, áudio, texto e outros (para arquivos em geral). Também há a opção de adicionar strings dentro do Resources.resx, mas aí já não se trata de arquivos em si. Vou falar apenas sobre arquivos e exemplificarei com um exemplo que adiciona e usa uma imagem e um exemplo que adiciona uma biblioteca (.dll).

Primeiro é necessário abrir a interface do Resources.resx.
Na árvore de arquivos do seu projeto, à direita na imagem abaixo, expanda a pasta Properties.
Fazendo isso o Resources.resx ficará visível, como na imagem.



terça-feira, 5 de abril de 2011

Exemplo de TextBox com máscara de horário em C#

Olha eu aqui de novo.


Hoje vou escrever um pouco sobre máscaras em TextBox. Mais especificamente sobre uma TextBox com máscara de horário no formato xx:xx que eu precisei fazer, mas a lógica básica para criar uma máscara serve como ideia, fora isso, só é necessário aplicar as regras específicas dependendo das regras da sua máscara.
O post de hoje é um pouco diferente, pois eu não vou, digamos assim, "dar o assunto por encerrado", a ideia é deixar a minha máscara incompleta, ou seja, não aplicar todas as regras necessárias.
Por quê?
Primeiro: porque dependendo de como você trabalha com a TextBox algumas regras podem ser desnecessárias, pois podem nunca acontecer.
Segundo: porque é para ser uma ideia geral apenas e não necessariamente completa.
Terceiro e mais improvável: se alguém ler e perguntar algo ou sugerir um problema relacionado especificamente com a máscara que eu vou abordar no post, eu posso fazer um edit e adicionar o caso sugerido.


Bom, primeiro explicando a ideia básica.
O objetivo é uma TextBox com uma máscara de horário xx:xx que, quando o usuário digitar, vá substituindo do primeiro ao último dígito do horário automaticamente. Ela começará com o valor 00:00 e as regras básicas que eu vou aplicar são:
1 - O primeiro dígito das horas não pode ser maior do que 2.
2 - Se o primeiro dígito das horas for 2 o segundo não pode ser maior do que 3.
3 - O primeiro dígito dos minutos não pode ser maior do que 5.
4 - O usuário não pode substituir o ':' em ocasião alguma.