Crear un instalador de Windows para una app .NET (WPF, WinForms, consola)
Publica una app de escritorio .NET con dotnet publish, elige entre dependiente del framework y autocontenida, y empaqueta la carpeta de publicación en un Setup.exe con accesos directos y desinstalador.
Actualizado el 31 de octubre de 2026 · 4 min de lectura
Visual Studio compila tu app WPF o WinForms, y dotnet publish te entrega una carpeta que funciona en cualquier parte. La pieza que falta es el instalador: la entrada en el menú Inicio, la carpeta en Program Files, la entrada de desinstalación en la Configuración de Windows. Los viejos ClickOnce y Visual Studio Installer Projects todavía existen, pero ambos acusan el paso del tiempo. Este es el camino directo de un proyecto .NET a un Setup.exe.
Paso 1: publicar la app
Publicar produce una carpeta con todo lo que la app necesita. Ejecútalo desde la carpeta del proyecto:
dotnet publish -c Release -r win-x64 --self-contained true
La salida queda en bin\Release\net8.0-windows\win-x64\publish\ (el framework de destino en la ruta varía según tu proyecto). Esa carpeta es lo que distribuyes.
La única decisión que importa:
- Autocontenida (
--self-contained true) incluye el runtime de .NET. La carpeta pesa entre 70 y 150 MB, pero funciona en cualquier máquina Windows sin instalar nada antes. Elige esta opción para software que distribuyes al público. - Dependiente del framework (
--self-contained false) pesa unos pocos MB, pero el usuario debe tener instalado el .NET Desktop Runtime correspondiente; si no, la app muestra un aviso de descarga en el primer arranque. Válida para herramientas internas en máquinas administradas.
Opciones útiles:
-p:PublishReadyToRun=trueprecompila la app para que arranque más rápido.-p:PublishSingleFile=trueconcentra la salida en un solo.exe. Funciona, pero un instalador elimina el motivo para usarlo, y las apps de un solo archivo desempaquetan las bibliotecas nativas en la primera ejecución. La carpeta normal es más simple.- El recorte (
PublishTrimmed) no es compatible con WPF ni WinForms; déjalo desactivado.
Define el icono de la app en el archivo del proyecto para que el .exe publicado lo lleve:
<PropertyGroup>
<ApplicationIcon>app.ico</ApplicationIcon>
</PropertyGroup>
Ejecuta el .exe publicado una vez desde la carpeta de publicación, idealmente en una máquina sin Visual Studio, para asegurarte de que no falta nada.
Paso 2: comprimir la carpeta de publicación
Comprime el contenido de publish`: el .exe, las DLL, .deps.json, .runtimeconfig.json y cualquier archivo de contenido. Deja fuera los archivos .pdb`, salvo que quieras símbolos de depuración en las máquinas de tus clientes.
Paso 3: construir el instalador
- Sube el zip a ExeTup. Selecciona el
.exede tu app como programa principal; confírmalo, porque una publicación autocontenida incluyecreatedump.exe, que no lo es. - Completa el nombre, la versión (mantenla alineada con
<Version>en el proyecto), el editor y la licencia. - Elige todos los usuarios para una app de escritorio clásica en Program Files, o usuario actual cuando los clientes puedan no tener permisos de administrador.
- Mantén 64 bits para una publicación
win-x64; elige 32 bits parawin-x86. - Sube el mismo
app.ico, activa los accesos directos y construye.
Descarga Setup.exe y prueba la instalación y la desinstalación en Windows.
Notas específicas de .NET
- Actualizaciones. Distribuye un nuevo instalador con una versión superior. Instalar sobre la versión anterior reemplaza los archivos; el instalador no incluye un canal de actualización automática.
- Configuración y datos. Escribe los datos del usuario en
%APPDATA%o%LOCALAPPDATA%, no junto al.exe. Program Files es de solo lectura para los usuarios normales, y el desinstalador solo elimina lo que instaló. - Requisitos previos. Las publicaciones autocontenidas no necesitan nada más. Si tu app necesita el runtime de Visual C++ o un controlador de base de datos, documéntalo; el instalador no encadena otros instaladores.
- Firma de código. Firma el
.exepublicado antes de comprimirlo y después firma elSetup.exedescargado. Consulta la guía sobre SmartScreen.
Alternativas
- Visual Studio Installer Projects genera archivos MSI desde dentro de Visual Studio. Sigue disponible como extensión, limitada e incómoda con publicaciones autocontenidas.
- ClickOnce ofrece instalaciones por usuario con actualización automática, ligadas a un servidor web que tú mantienes.
- WiX Toolset construye archivos MSI a partir de XML y es el estándar para empaquetado MSI de nivel empresarial. Potente, con una curva de aprendizaje a la altura.
- MSIX es el formato de paquete más reciente de Microsoft, ideal cuando apuntas a la Microsoft Store.
Consulta Instaladores MSI vs EXE para saber cuándo importa el formato.
Preguntas frecuentes
¿Debo publicar dependiente del framework o autocontenida?
Autocontenida para todo lo que entregues al público, de modo que la app funcione sin descargar un runtime. Dependiente del framework para herramientas internas en máquinas donde el departamento de TI administra el runtime de .NET.
¿El instalador incluye el runtime de .NET?
Si publicas autocontenida, sí, porque forma parte de la carpeta de publicación. El instalador distribuye lo que haya en el zip.
¿Puedo generar un MSI para directivas de grupo?
ExeTup construye un Setup.exe. Se instala de forma silenciosa con /S, lo que cubre la mayoría de despliegues por script. Para directivas que solo aceptan MSI, WiX es la herramienta adecuada.
¿Con qué versiones de .NET funciona esto?
Con cualquiera que genere una carpeta de publicación: .NET 6, 7, 8, 9 y posteriores, y apps de .NET Framework compiladas con Visual Studio (usa la salida de bin\Release).
Guías relacionadas
- Cómo crear un Setup.exe para tu app de Windows (sin código)Qué hace realmente un Setup.exe, las tres formas de crear uno y cómo convertir la carpeta de tu app en un instalador profesional en minutos, sin escribir ningún script.
- MSI o EXE: ¿qué instalador debería distribuir tu app para Windows?Las diferencias reales entre un paquete MSI y un Setup.exe, cuándo los departamentos de TI necesitan MSI de verdad, dónde encaja MSIX y por qué la mayoría de las aplicaciones de escritorio se distribuyen como EXE.
- «Windows protegió su PC»: qué significa el aviso de SmartScreen y cómo eliminarloPor qué Windows muestra el aviso de «editor desconocido» en un instalador nuevo, qué pueden pulsar los usuarios y cómo la firma de código y la reputación hacen que desaparezca.