Fazer chamadas em P/Invoke nunca foi algo muito divertido. Se fosse, não teríamos referências de assinaturas em sites como o excelente Pinvoke.Net (com seu excelente Add-in para o Visual Studio, que comentei na edição 41 da .Net Magazine). Já vi até desenvolvedor que mantinha uma pequena coleção de assinaturas de métodos guardados, caso precisasse, tão chato é criar esse tipo de coisa do zero.

Qual não foi minha surpresa ao perceber que o Jarred Parsons, da equipe do VB.Net, desenvolveu uma ferramenta para facilitar esse trabalho, chamada de P/Invoke Interop Assistant (atualmente na versão 1.0), e falou sobre ela em Janeiro deste ano, e eu não vi? Só fiquei sabendo quando ele blogou a respeito no blog do time do VB. Baixei na hora, testei, e posso afirmar: funciona muito bem.

Ela tem uma busca por assinaturas conhecidas, com essa busca que fiz do RegQueryReflectionKey, advapi32.dll:

PIIteropAssist  

E tem também a opção de você digitar a assinatura e ela criar a chamada gerenciada:

PIIteropAssist2  

Notem que a ferramenta reconhece chamadas de assinaturas conhecidas como essa que fiz da função FindFirstFileW, e corretamente puxou a referência para kernel32.dll. Além disso, como a função tem estruturas dependentes, ela também trouxe o código destas estruturas. No exemplo acima vocês podem ver a estrutura FILETIME, e mais acima, sem aparecer, existe a WIN32_FIND_DATAW.

Agora, se você está trabalhando em uma equipe mista, que usa código gerenciado e não gerenciado, ela também ajuda. Ela pode não conhecer a referência à sua dll, e as estrutura, mas ela consegue compor a assinatura mesmo assim. Dêem uma olhada, com uma função que inventei:

PIIteropAssist3

Ela gera o código em C# e em VB e se preocupa com vários aspectos complexos de marshalling, para oferecer performance às chamadas. Não bastasse tudo isso, também oferece suporte à tradução de métodos gerenciados para não gerenciados.

Sem dúvida é uma para manter no toolbox, e acompanhar as novas versões.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.