Anda di halaman 1dari 5

Armazenando bibliotecas em

subdiretrios no C#
Voc j deve ter ouvido aquele ensinamento de que no devemos reinventar a roda, certo? O que
isso quer dizer no mundo do desenvolvimento de software que, ao invs de ficarmos escrevendo
bibliotecas novas para resolver problemas que j foram resolvidos, devemos, na medida do
possvel, utilizar bibliotecas j prontas que do conta do recado. Por exemplo, voc quer tirar fotos
com a webcam no seu aplicativo? Utilize uma biblioteca pronta que implementa essa
funcionalidade. O mesmo vale para leitura de RSS, manipulao de arquivos zip,mapeamento de
dados entre objetos, manipulao de PDFs, etc.
Mas, quando utilizamos uma biblioteca no nosso aplicativo, temos que distribu-la juntamente com a
aplicao. comum nesse caso colocarmos as dlls das bibliotecas externas no mesmo diretrio da
aplicao, dessa forma, o .NET consegue carreg-las normalmente. Porm, dependendo da
quantidade de bibliotecas externas que utilizamos, a pasta de instalao do nosso aplicativo pode
acabar ficando uma verdadeira baguna. O que podemos fazer para melhorar um pouco essa
situao? Um dos inscritos da minha newsletter perguntou se seria possvel armazenar as
bibliotecas em subdiretrios e, baseado nessa questo, resolvi escrever esse artigo mostrando as
minhas concluses.
Depois de pesquisar sobre esse tema, descobri que temos duas opes para armazenarmos e
carregarmos bibliotecas em subdiretrios ao desenvolvermos aplicativos com o .NET Framework. A
primeira delas adicionarmos uma tag nova no app.config. J a segunda opo utilizarmos o
evento AssemblyResolve do AppDomain. Vamos conferir como conseguimos utilizar essas duas
opes.

Configurando o Assembly Binding no


app.config
Para suportarmos o carregamento de bibliotecas em um subdiretrio utilizando o app.config, temos
que adicionar uma nova tag com a informao de assembly binding. Por padro, ao criarmos um
projeto com o Visual Studio, ele j adiciona um arquivo app.config. Portanto, abra esse arquivo e,
dentro da tag configuration, adicione a seguinte informao:
1 <runtime>
2 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

3 <probing privatePath="lib" />

4 </assemblyBinding>
5 </runtime>

Veja como fica o antes:

E o depois:

Como voc pode perceber, dentro da tag probing, atributo privatePath, conseguimos definir um
subdiretrio (nesse exemplo lib) que o .NET Framework olhar para fazer o carregamento de
bibliotecas externas. Dessa forma, quando executamos a nossa aplicao, primeiramente o .NET
Framework tentar encontrar a biblioteca externa no GAC, depois na pasta do aplicativo e depois
no subdiretrio lib. Fcil, no? S no esquea de distribuir o arquivo de configurao junto com a
aplicao!

Utilizando o evento AssemblyResolve


A segunda opo para fazermos o carregamento de bibliotecas externas a partir de subdiretrios
a utilizao do evento AssemblyResolve. Esse evento disparado toda vez que o .NET Framework
no consegue encontrar uma biblioteca externa necessria ao nosso aplicativo. No handler desse
evento, temos a possibilidade de indicar um novo caminho de onde o assembly deve ser carregado.

Para utilizarmos essa alternativa, temos que fazer o tratamento desse evento em algum lugar global
(de preferncia no mtodo Main da classe Program ou em algum outro lugar global onde voc
esteja fazendo a inicializao do seu aplicativo):

1 class Program
2 {

3 static void Main(string[] args)

{
4
AppDomain.CurrentDomain.AssemblyResolve
5
+= new ResolveEventHandler(LoadFromSubFolder);
6

7
// Aqui voc continua com o resto de cdigo do mtodo Main.
8
}
9

10 static System.Reflection.Assembly LoadFromSubFolder(object sender,


11 ResolveEventArgs args)
12 {

13 string folderPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly

14 string assemblyPath = System.IO.Path.Combine(folderPath, "lib",

new System.Reflection.AssemblyName(args.Name).Name + ".dll");


15
if (!System.IO.File.Exists(assemblyPath)) return null;
16
System.Reflection.Assembly assembly =
17
System.Reflection.Assembly.LoadFrom(assemblyPath);
18
return assembly;

Note que a utilizao desse evento muito simples. Quando uma biblioteca no encontrada pelo
.NET Framework, tentamos encontrar uma biblioteca com o mesmo nome s que no subdiretrio
lib. Caso ela seja encontrada, ns carregamos uma instncia de Assembly utilizando essa
biblioteca e retornamos. Caso contrrio, retornamos null.

Essa opo, apesar de parecer mais complexa primeira vista, muito mais poderosa e flexvel.
Voc pode fazer o malabarismo que quiser e carregar bibliotecas de onde quer que voc precise,
ao contrrio da primeira opo, onde voc s pode informar um subdiretrio a ser considerado.

Concluindo
A utilizao de bibliotecas algo que todo programador ter que enfrentar durante o
desenvolvimento de aplicativos. Nesse artigo voc conferiu como organizar as bibliotecas externas
em um subdiretrio no desenvolvimento de aplicaes com o .NET Framework. No perca mais
tempo e v agora mesmo organizar a pasta do seu aplicativo!

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 tambm em primeira mo sobre o artigo da
prxima semana, alm de receber dicas bnus que eu s compartilho por e-mail. Inscreva-
se aqui ou utilizando o formulrio logo abaixo.

At a prxima!

Anda mungkin juga menyukai