terça-feira, 6 de março de 2012

ILSpy: Ferramenta para “decompilar” Assemblies .NET

Quando você pega um projeto que usa algumas bibliotecas feitas pelo desenvolvedor anterior, você PRECISA fazer algumas alterações nela ou, no meu caso, compilar o projeto com um componente mais atual porque se for usar a biblioteca original ele OBRIGA A USAR a versão antiga e que o fonte foi pras cucuias?

De posse da biblioteca original você poderá ver o código-fonte usando uma ferramenta oferecida pelo próprio Visual Studio: IL Disassembler, ou IL DASM para os mais chegados. Mas tem um porém: ela apresenta o código na Common Intermediate Language (CIL), o código que o compilador JIT do .NET Framework traduz para código de máquina e por fim é executado. Bem, não é nada produtivo ficar tentando entender a IL, certo?

Há algum tempo atrás, existia uma ferramenta gratuita chamada .NET Reflector. Esta ferramenta traduzia a IL para C# ou outras linguagens da plataforma .NET e exportava para um projeto, prontinho para compilar. Um porém desta ferramenta é que ela forçava os updates automáticos, de forma que se a rotina de atualização fosse cancelada o programa “matava a si próprio”, ou seja, era apagado do disco. E não adiantava reinstalar. No fim, o desenvolvedor vendeu o .NET Reflector para a empresa Red Gate, que continua o seu desenvolvimento porém o aplicativo agora é pago e a versão Standard custa US$ 35,00 (fonte: http://www.reflector.net/).

Dando uma pesquisada por aí, achei um substituto legal e que cumpre ao meu propósito: o ILSpy. Ele também é um “disassembler” para .NET, que traduz o código em IL para C# e permite salvar o projeto. Só que com um detalhe: é de código-aberto e grátis.


Com ele, consegui pegar todas as classes que precisava, colar em um novo projeto, referenciar as bibliotecas mais atuais e compilar. Mas nem tudo são flores: Ele traduz o código de algumas propriedades, principalmente indexadas, colocando no lugar da propriedade a chamada para seu método ancestral, “getter” ou “setter, por exemplo:

//Como a propriedade é colocada no código original:
MeuDataSet.Tables[i];
MeuArrayList.Count;
MeuDataRow["CAMPO"] = valor;

//Como ela é traduzida pelo IL Spy
MeuDataSet.get_Tables(i);
MeuArrayList.get_Count();
MeuDataRow.set_Row("CAMPO",valor);

Quando compilava sem fazer o devido ajuste ocorria um erro de compilação, pois os getters e setters das propriedades exemplificadas acima não são métodos públicos, portanto não poderiam ser acessados de fora da classe onde foram declarados.

Tirando esse pequeno atormento (que dependendo do código se torna um grande atormento…), repito que a ferramenta atendeu os meus objetivos e a recomendo em casos de emergência ou até mesmo para estudo de fontes (desde que não estejam ofuscados, claro!).


Créditos: Leonel Fraga

0 comentários:

Postar um comentário

 
;