Executando código dinamicamente em .NET – Compilando Código C# em Runtime

Em um projeto recente do qual participei, tive a necessidade de alterar partes do codigo de forma extremamente rápida devido a mudanças na legislação.  Atualizar toda a aplicação não era uma opção a ser considerada, então decidi implementar uma funcionalidade que permitisse que a aplicação fizesse o download de trechos de código que eram alterados frequentemente e substituisse o trecho antigo, passando a utilizar o novo algoritmo.

A aplicação em questão realiza alguns cálculos de taxas que mudam mensalmente. Agora o aplicativo busca no servidor o código a ser utilizado para realizar os cálculos de forma dinâmica.

Para fazer isto utilizei a class CSharpCodeProvider do framework Dotnet, que permite que usemos código em C# como uma linguagem script.

Neste artigo mostro como criar uma aplicação simples que possui dois listbox, o primeiro possui uma relação de países, e o segundo será populado através de um código que deve ser informado pelo proprio usuario em um textbox..

Classe de apoio para instanciação do trecho de codigo

Esta clkasse é apenas um “helper” para facilitar a instanciação do script informado. Basta passar o codigo para esta classe em conjunto com o nome da classe principal do código que está sendo enviado e caso necessário os assemblies utilizados.

Form principal

No form principal, In existe um textbox chamado txtCodeToRun. Neste textbox o usuario poderá informar o código que será utilizado para ler o primeiro listbox e popular o segundo listbox. Neste exemplo, voce não precisa criar a função nem definir a classe, pois isto já estará pré-definido. Basta informar o conteúdo da função. Perceba que pego o trecho de codigo informado e já concateno com a classe e a definição da função. Obviamente voce poderia permitir que toda a definição da classe fosse informada e executada.

Segue o código do form:

Como voce pode verificar, o textbox irá conter o corpo da função, e a funcao irá receber como único parâmetro o listbox que contem a lista de países. De posse desta informação, dentro da função voce irá popular a variavel de retorno (um List<string>) que posteriormente será utilizado para popular o segundo listbox. Outro enfoque possivel seria passar os dois listbox como parametro e a operação seria realizada diretamente no listbox de destino.

Dentro da função voce pode realizar qualquer operacao no listbox de origem que desejar, iremos aqui apenas selecionar alguns dos elementos e popular a variavel de retoro irá popular o listbox de destino.

Se o script digitado apresentar algum erro, a classe “helper” irá retornar o erro, e neste exemplo iremos mostrar os erros na parte de baixo da tela.

Use o seguinte trrecho de código para adicionar no listbox de destino todos os países que iniciam com a letra “C”:

Dynamic Code Example

Assim, outro exemplo seria popular a lista com os paises que iniciam com “C” e “G”:

É isto. Bem simples e uma funcionalidade extremamente interessante que pode trazer diversos benefícios para sua aplicação.

Voce pode fazer o download do código fonte em Here (ZIP file)

oleonardomachado

Software architect with expertise in Microsoft technologies (C#, WCF, Azure etc) and now developing for mobile

Deixe uma resposta