IL weaving para quem não sabe nada sobre IL weaving

William Barbosa
4 min readOct 24, 2017

--

AVISO: Esse é o primeiro artigo de uma série onde eu explico sobre weaving em .NET. Esse artigo é para quem não sabe nada sobre assunto e quer começar a consumir weavers, então se você já sabe do que eu estou falando, sinta-se livre para pular esse artigo (ou talvez leia-o para aprender algo novo). Ele também está disponível em inglês, caso você tenha interesse.

Introdução 🎉

Eu comecei esse série por dois motivos: Primeiro porque escrever sobre um assunto que eu estou estudando me ajuda a absorver melhor o conteúdo. Segundo, e mais importante, é porque tem pouquíssimo conteúdo sobre esse assunto, especialmente em português. Os artigos existentes não vão tão a fundo nos tópicos avançados, então o objetivo da série é preencher essas lacunas. Esse primeiro artigo servirá para nivelar a audiência.

Esse artigo foi escrito partindo do principio de que o leitor nunca leu nada sobre weavers. Você só precisa saber um pouco de C# e estar disposto a aprender coisas novas. Aqui vamos só aprender como consumir weavers, mas mais pra frente na série vamos ver como criar os nossos próprios também!

Weaving? 🤔

Weaving é um conceito meio assustador. Se trata do ato de manipular um arquivo .dll já compilado para injetar nele instruções adicionais. Isso é usado, por exemplo, para reduzir a quantidade de boilerplate na sua base de código, delegando tarefas repetitivas para um computador, que não vai copiar e colar código errado porque está trabalhando demais.

O motivo pela qual weaving assusta tanto é porque mexer em .dlls parece um jeito de dizer para o mundo que você é entende mais do que o próprio time responsável pelo Roslyn. Quase sempre você não sabe (Jon Skeet é uma exceção que vem a mente). Tendo sentido essa preocupação no começo, eu a entendo perfeitamente. A abordagem de mexer em .dlls parece frágil e a ideia soa como um exagero. Contudo, as ferramentas atuais de weaving simplificam tanto o processo que você vai se arrepender de não ter começado antes!

Só para mostrar que eu não estou dizendo da boca pra fora, nos últimos 3 anos eu não lembro de ter escrito nenhuma aplicação .net que não usasse weavers. Os apps que eu estou trabalhando atualmente no Toggl (que são OSS e você pode conferir aqui) são exemplo disso. Weavers também são usados pelo Realm, o banco de dados mobile first, para injetar chamadas nativas para código C++ em todas as propriedades que herdam de RealmObject.

Então como eu começo? 🤓

O caso de uso mais comum para weavers é remover o boilerplate necessário para consumir a interface INotifyPropertyChange. Ao implementar essa interface, você precisa garantir que:

  • O valor mudou para que a notificação de mudança não seja em vão
  • O método não faz nada caso não haja modificação
  • O valor do backing field é alterado
  • Uma notificação de que a propriedade mudou é disparada

Isso significa que você não pode usar Auto Properties, uma funcionalidade do C# que reduz o tamanho das propriedades ao gerenciar o backing field sem expo-lo, e que suas propriedades ficarão assim:

11 linhas de código por propriedade? Não mesmo🙅

Weaving ao resgate⛑

Acabamos de identificar uma tarefa que ocorre mais de uma vez e é tediosa de se repetir. O código é basicamente o mesmo, então iremos nos pegar copiando e colando o tempo todo, tornando essa tarefa propícia a erros. O próximo passos? Usar weavers!

Para tanto, nós usaremos o Fody (pronunciado fori, e o ri tem o mesmo som do ri de marido). Ele é uma ferramenta que faz todo o trabalho pesado de integração com o sistema de build, assim não precisamos fazer isso nós mesmos. Lembra quando eu disse que era tudo simples? É porque o Fody existe.

O Fody por si só, contudo, não faz nada. Ele meramente provê um mecanismo para consumirmos add-ins. Mais pra frente nós veremos como criar nossos add-ins, mas por hora vamos nos contentar em consumir o plugin de PropertyChanged, que é muito utilizado e, consequentemente, bem testado.

O Fody funciona tanto no Visual Studio do Windows quanto no do Mac. Basta simplesmente instalar o pacote PropertyChanged.Fody. Ele irá instalar o pacote do Fody como uma dependência e adicionará um arquivo chamado FodyWeavers.xml ao seu projeto. Abra esse arquivo para garantir que ele possui o nome do plugin que você quer usar, como mostrado abaixo:

Et voilà! Você instalou um pacote NuGet e olhou para um arquivo XML e, em troca, a sua ViewModel que antes precisava de 11 linhas para cada propriedade ficou assim:

Uma troca mais do que justa, não?

Legal, mas isso funciona mesmo? 🙄

Como já dito, weaving é uma técnica muito utilizada entre desenvolvedores .NET. O pacote do PropertyChanged tem quase meio milhão de downloads e o Realm, que também usa o Fody, tem quase 100 mil.

Se isso não basta para te convencer, fique ligado nos próximos artigos, onde eu irei mais fundo em como o processo de weaving funciona e mostrarei como você pode manipular dlls para fazer qualquer tarefa.

Enquanto esse artigo não chega, sinta-se livre para explorar o Fody! Instale o PropertyChanged.Fody em um projeto de teste, leia a documentação do plugin, procure outros plugins para brincar e não hesite em me chamar no twitter se precisar de qualquer ajuda!

--

--