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.