Há, muito, muito tempo atrás
Em 2002, conheci o projeto SharpDevelop – uma ousada tentativa de criar, do zero, em .NET, uma IDE para competir com o Visual Studio.
Dentre as particularidades do SharpDevelop estava, na época, seu suporte extremamente amplo a add-ins. Tudo que se via na interface era carregado dinamicamente a partir de arquivos de configuração em XML – ligando, por exemplo, definições de itens de menu a classes carregadas dinamicamente usando reflection.
![](https://elemarjr.com/wp-content/uploads/2020/05/SharpDevelop-1024x710.png)
Gostava tanto da arquitetura e da sofisticação daquele código que comprei um livro, escrito pelos criadores do projeto, que explicava, com algum detalhe, as ideias empregadas.
![](https://elemarjr.com/wp-content/uploads/2020/05/249.jpg)
Naquele mesmo ano, iniciei o desenvolvimento de uma nova versão do Promob – que é mantida como “base” do sistema, até onde sei, ainda hoje – utilizando conceitos que aprendi nesse livro. Para minha felicidade, o produto (Promob) foi extremamente bem sucedido. Por outro lado, reconheço, hoje, que exagerei na dose. Menus, toolbar, painéis, absolutamente tudo é carregado, dinamicamente, a partir de arquivos XML neste sistema também.
![](https://elemarjr.com/wp-content/uploads/2020/05/3.jpg)
Entre gostos e desgostos, já são quase 18 anos vivendo as delícias e os dissabores da flexibilidade e das “dores de cabeça” de usar recursos como reflection. Lembro-me, por exemplo, dos apertos de ter um sistema consumindo mais de 100MB de memória quando o computador padrão dispunha de pouco mais de 64MB de RAM e o Windows XP, sozinho, consumia quase isso.
.. quando os recursos eram escassos
Tentando extrair “leite de pedra”, precisei aprofundar por anos meu entendimento de como .NET funcionava. Aprendi sobre CIL e entendi as vantagens de, eventualmente, gerar código executável de maneira dinâmica. Meu mundo mudou quando encontrei um livro excelente do Simon Robinson explicando conceitos avançados de .NET.
![](https://elemarjr.com/wp-content/uploads/2020/05/51R91RBG3VL._SX258_BO1204203200_.jpg)
Em 2008, resolvi começar a compartilhar um pouco de minhas lições aprendidas. Comecei a produzir conteúdo sobre CIL e, não muito depois, resolvi compartilhar um projeto que utilizava para facilitar emitting – trata-se do projeto FluentIL.
.. e as demandas eram imensas
Inspirado por um capítulo escrito de Charles Petzold no excelente livro Beautiful Code, ampliei FluentIL para me permitir emitir filtros customizados de imagens dinamicamente.
![](https://elemarjr.com/wp-content/uploads/2020/05/41jlLBcyDbL._SY445_QL70_ML2_.jpg)
Compartilhei o código e as ideias em um post em uma “versão antiga” do meu blog – ainda em WordPress – em 2011.
.. aprendi a fazer metaprogramação, em .NET, “na unha”
Sabendo um bocado sobre geração de código e estudando muito ferramentas para geração de binários como Mono.Cecil, resolvi me aventurar modificando a pipeline de compilação do .NET.
Comecei a utilizar os eventos de post build do compilador para disparar a execução executáveis customizados que modificam os assemblies para gerar, automaticamente, suporte a AOP e outras features. Compartilhei, resumidamente, a ideia, também em um blog post.
![](https://elemarjr.com/wp-content/uploads/2020/05/metaprogramming.jpg)
… meu foco mudou
Desde 2015 não mexo no código do FluentIL. Há ali um bocado do meu estilo de programar em outros tempos. A memória permanece no Github.
.. até que hoje
A Microsoft está introduzindo suporte a metaprogramação em .NET. Compartilhei, em EximiaCo.ms, uma publicação compartilhando a novidade.
Melancólico, viajei no túnel do tempo… Para ser mais preciso, voltei para 2002.