Carregando biblioteca no código com C#
Autor: _ivan | Publicado: 2011-04-29T15:54:00-03:00

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
{
&nbsp;&nbsp;&nbsp; public partial class Form1 : Form
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Form1()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();

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


É 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.