Carregamento e descarregamento de dll

Suponhamos que somos deparados com um cenário em que é necessário executar processos de diversas naturezas em múltiplas máquinas. Uma possível solução passa por desenvolver um serviço que, instalado em cada uma delas, nos permita executar várias Assemblies. Porém, pretendemos descartá-las e removê-las do sistema, caso estas deixem de ser necessárias, sem parar o serviço.

O carregamento de uma Assembly num programa em execução é simples quando recorremos aos métodos proporcionados no espaço de nomes System.Reflection. Por seu turno, quando uma Assembly é carregada num programa em execução, pode apenas ser descarregada e eliminada do sistema quando todos os domínios de aplicação (AppDomain) nas quais se encontra carregada forem descartados. Ora, se a Assembly se encontrar carregada no domínio de aplicação do programa ou serviço que se encontra em execução, esta só pode ser removida do sistema caso o programa seja parado.

De modo a ser possível descarregar uma Assembly, esta terá de ser carregada apenas num domínio de aplicação diferente, sendo a comunicação entre domínios de aplicação efectuada por intermédio da serialização de um objecto de um subtipo da classe MarshalByRefObject, o qual recebe genericamente o nome de representante (proxy). O fluxo geral deste tipo de processo descreve-se essencialmente nos passos seguintes:

  1. A Assembly que contém classe representante é carregada no domínio de aplicação principal;
  2. É criado um novo domínio de aplicação;
  3. É carregada a Assembly que contém a classe representante no domínio criado;
  4. É criada uma instância do representante no domínio de aplicação criado, sendo retornado um controlador (handle) para o domínio de aplicação principal;
  5. É executada a função do representante que permite carregar a Assembly.

Toda a comunicação subsequente com a Assembly terá de ser realizada por intermédio do controlador associado ao representante. No onedrive coloquei o ficheiro CarregamentoDll.zip  no qual se encontra uma solução em Visual Studio onde se encontra implementado todo o processo. Com um pouco de inspecção vemos facilmente que a classe ModulesHost é a representante. A criação do domínio e o carregamento da classe representante está ao cargo de um objecto do tipo MdoulesLoader.

A solução encontra-se decomposta em três livrarias e um programa de testes. Na livraria Common encontra-se definida a interface que todos os objectos instanciáveis a partir do anfitrião devem implementar. As duas soluções FirstModuleSecondModule definem as Assemblies que serão carregadas pelo programa de testes. O programa, por seu turno, encontra-se configurado para ler as Assemblies da directoria C:\temp, a qual pode ser alterada no código. Se executarmos o programa, podemos emitir a instrução

cmd>carrega FirstModule.dll dominio1

que carrega no domínio dominio1 a Assembly a partir do ficheiro FirstModule.dll que se encontra na directoria C:temp. Se fizermos agora

cmd>carrega SecondModule.dll dominio2

conseguimos carregar a Assembly SecondModule.dll no domínio de aplicação dominio2 que terá de se encontrar na mesma directoria.

Se tentarmos eliminar cada uma das Assemblies do sistema, surge a mensagem que indica que o ficheiro se encontra em utilização. Se fizermos, de seguida,

cmd>descarrega dominio1
cmd>descarrega dominio2

o programa mantém-se em execução mas, desta vez, conseguimos remover os ficheiros.

Convém deixar aqui um nota final. Para colocar um programa do género num sistema produtivo é necessário ter em conta dois aspectos essenciais. O primeiro prende-se com a segurança. O segundo, com o facto de que as Assemblies poderão executar código que contém excepções não tratadas ou que executa indefinidamente.

Sobre Sérgio O. Marques

Licenciado em Física/Matemática Aplicada (Astronomia) pela Faculdade de Ciências da Universidade do Porto e Mestre em Matemática Aplicada pela mesma instituição, desenvolvo trabalho no PTC (Porto Technical Centre) - Yazaki como Administrador de bases-de-dados. Dentro o meu leque de interesses encontram-se todos os temas afins às disciplinas de Matemática, Física e Astronomia. Porém, como entusiasta, interesso-me por temas relacionados com electrónica, poesia, música e fotografia.
Esta entrada foi publicada em Computadores e Internet com as etiquetas , , , . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s