Article image
André Fanelli
André Fanelli30/07/2025 23:09
Compartilhe

Automatizando a Geração de Executáveis Personalizados com .NET Publish

    Em projetos modernos, muitas vezes precisamos gerar aplicações desktop sob demanda com parâmetros únicos, como tokens de acesso, configurações específicas de clientes ou um TenantId. No projeto Inventarium, desenvolvi uma solução onde o sistema web ASP.NET Core gera um executável Windows (.exe) personalizado em tempo real, utilizando o comando dotnet publish.

    O problema

    O Inventarium possui um sistema web multi-tenant para controle de ativos de TI. No entanto, era necessário disponibilizar uma aplicação desktop (WinForms) para inventariar máquinas offline ou em ambientes isolados.

    Cada executável precisava carregar um identificador exclusivo (TenantId) no código, evitando login ou configuração manual.

    A solução: dotnet publish no back-end ASP.NET Core

    Ao invés de usar o MSBuild diretamente (como era feito anteriormente), migrei para o uso do comando dotnet publish, que oferece:

    • Compilação otimizada;
    • Criação de executáveis autocontidos ou dependentes do runtime;
    • Controle sobre o tamanho final do app (no nosso caso, ~3MB);
    • Uso direto via C# com ProcessStartInfo ou Shell script.

    Como funciona a automação

    Quando o administrador clica em "Gerar Aplicativo", o sistema realiza:

    • Criação de uma cópia temporária do projeto desktop (InventariumDesktopApp)
    • Substituição do TenantId no arquivo AppConfig.cs:
    public static class AppConfig {
      public static string TenantId = "tenant-xyz123";
    }
    
    • Execução do comando:
    dotnet publish -c Release -r win-x64 --output ./ExportBuilds/tenant-xyz123 --no-self-contained
    
    • -c Release: build otimizado
    • -r win-x64: runtime para Windows 64-bit
    • --output: pasta onde o executável será gerado
    • --no-self-contained: requer o .NET Runtime instalado, gerando um .exe leve (~3MB)
    • Compactação automática (.zip) da pasta final.
    • Exibição para download no painel web.

    Por que usei --no-self-contained?

    • Optar por --no-self-contained foi estratégico:
    • Reduzi drasticamente o tamanho do executável (~3MB vs. 150MB com dependências).
    • Todos os clientes já possuem .NET Runtime instalado nos dispositivos corporativos.
    • Atualizações e deploy são mais rápidos.
    • Caso a aplicação precise rodar em máquinas sem o runtime, basta alternar para:
    dotnet publish -c Release -r win-x64 --self-contained true
    

    Benefícios dessa abordagem

    • Escalabilidade: cada Tenant recebe sua própria build exclusiva;
    • Segurança: dados sensíveis são compilados, não expostos externamente;
    • Experiência do usuário: download rápido, sem configurações adicionais;
    • Manutenção centralizada: qualquer alteração no core do app pode ser propagada rapidamente.

    Tecnologias utilizadas

    • ASP.NET Core MVC
    • C#
    • dotnet publish
    • Entity Framework Core
    • Bootstrap 5 + SweetAlert2 (interface)
    • Processamento assíncrono com Task.Run no backend
    • Geração de .zip com System.IO.Compression

    Conclusão

    A automação da geração de executáveis personalizados com o dotnet publish foi uma ótima oportunidade de explorar cenários reais de distribuição de aplicações desktop a partir de um sistema web. No projeto Inventarium, experimentei unir o poder do .NET com lógica sob demanda em um painel administrativo, o que proporcionou uma solução prática, segura e personalizável — ideal para treinar habilidades voltadas à escalabilidade e automação com baixo custo de infraestrutura.

    Compartilhe
    Comentários (1)
    DIO Community
    DIO Community - 31/07/2025 09:29

    Excelente artigo, André. Você mostrou um caso de uso avançado e extremamente prático do dotnet publish, transformando um processo manual e complexo em uma solução automatizada, escalável e segura. A forma como você detalhou as etapas torna a ideia clara e aplicável para outros projetos que enfrentem desafios parecidos.

    Na DIO acreditamos que soluções como a que você descreveu representam o que há de mais valioso na tecnologia: unir criatividade, automação e boas práticas para resolver problemas reais de forma eficiente.

    Na sua visão, qual foi o maior desafio nesse projeto: integrar a geração dos executáveis ao sistema web ou otimizar o tamanho e a distribuição desses builds personalizados?