Cree una aplicación de consola .NET Core para generar un EXE
Para un proyecto de aplicación de consola dirigido a .NET Core 1.0, no puedo entender cómo hacer que se genere un .exe durante la compilación. El proyecto funciona bien en depuración.
Intenté publicar el proyecto, pero tampoco funciona. Tiene sentido ya que un archivo EXE sería específico de la plataforma, pero debe haber una manera. Mis búsquedas solo arrojaron referencias a versiones anteriores de .NET Core que usaban project.json.
Cada vez que construyo o publico, esto es todo lo que obtengo:
Para fines de depuración, puede utilizar el archivo DLL. Puedes ejecutarlo usando dotnet ConsoleApp2.dll
. Si desea generar un archivo EXE, debe generar una aplicación independiente.
Para generar una aplicación autónoma (EXE en Windows), debe especificar el tiempo de ejecución de destino (que es específico del sistema operativo al que se dirige).
Solo antes de .NET Core 2.0 : primero, agregue el identificador de tiempo de ejecución de los tiempos de ejecución de destino en el archivo .csproj ( lista de RID admitidos ):
<PropertyGroup>
<RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64</RuntimeIdentifiers>
</PropertyGroup>
El paso anterior ya no es necesario a partir de .NET Core 2.0 .
Luego, configure el tiempo de ejecución deseado cuando publique su aplicación:
dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r ubuntu.16.10-x64
ACTUALIZACIÓN: FEB2022 Lo siguiente sigue siendo válido para .NET 6
¡ACTUALIZACIÓN para .NET 5!
Lo siguiente se aplica a partir de noviembre de 2020, cuando .NET 5 esté disponible oficialmente.
(consulte la sección de terminología rápida a continuación, no solo los procedimientos)
Instrucciones (CLI)
Requisitos previos
- Descargue la última versión del SDK de .net 5. Enlace
Pasos
- Abra una terminal (por ejemplo: bash, símbolo del sistema, powershell) y en el mismo directorio que su archivo .csproj ingrese el siguiente comando:
dotnet publish --output "{any directory}" --runtime {runtime}
--configuration {Debug|Release} -p:PublishSingleFile={true|false}
-p:PublishTrimmed={true|false} --self-contained {true|false}
ejemplo:
dotnet publish --output "c:/temp/myapp" --runtime win-x64 --configuration Release
-p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained true
Instrucciones (GUI)
Requisitos previos
- Si lee antes de NOV2020: última versión de Visual Studio Preview*
- Si lee NOV2020+: última versión de Visual Studio*
*En los 2 casos anteriores, el último SDK de .net5 se instalará automáticamente en su PC.
Pasos
Haga clic derecho en Proyecto y haga clic en Publicar
Haga clic en Inicio y elija Carpeta de destino, haga clic en Siguiente y elija Carpeta
Ingrese cualquier ubicación de carpeta y haga clic en Finalizar
Haga clic en Editar
Elija un tiempo de ejecución de destino y marque Producir archivo único y guarde.*
Haga clic en Publicar
Abra una terminal en la ubicación donde publicó su aplicación y ejecute el archivo .exe. Ejemplo:
Un poco de terminología
Tiempo de ejecución objetivo
Ver la lista de RID
Modo de implementación
- Dependiente del marco significa que se produce un pequeño archivo .exe, pero la aplicación supone que .Net 5 está instalado en la máquina host.
- Autocontenido significa un archivo .exe más grande porque el .exe incluye el marco, pero luego puede ejecutar el .exe en cualquier máquina, sin necesidad de preinstalar .Net 5. NOTA: CUANDO SE UTILIZA EL AUTÓNOMO, SE PRODUCIRÁN DEPENDENCIAS ADICIONALES (.dll), NO SÓLO EL .EXE
Habilite
el TLDR de compilación ReadyToRun: es el equivalente de .Net5 a la compilación anticipada (AOT). Precompilada en código nativo, la aplicación normalmente se inicia más rápido. La aplicación tiene más rendimiento (¡o no!), dependiendo de muchos factores. Más información aquí
Recortar ensamblajes no utilizados
Cuando se establece en verdadero, dotnet generará un archivo .exe muy sencillo y pequeño y solo incluirá lo que necesita. Ten cuidado aquí. Ejemplo: cuando utilices la reflexión en tu aplicación, probablemente no quieras establecer este indicador en verdadero.
Documento de Microsoft
Lo siguiente producirá, en el directorio de salida,
- todas las referencias del paquete
- el conjunto de salida
- el exe de arranque
Pero no contiene todos los ensamblados de tiempo de ejecución de .NET Core.
<PropertyGroup>
<Temp>$(SolutionDir)\packaging\</Temp>
</PropertyGroup>
<ItemGroup>
<BootStrapFiles Include="$(Temp)hostpolicy.dll;$(Temp)$(ProjectName).exe;$(Temp)hostfxr.dll;"/>
</ItemGroup>
<Target Name="GenerateNetcoreExe"
AfterTargets="Build"
Condition="'$(IsNestedBuild)' != 'true'">
<RemoveDir Directories="$(Temp)" />
<Exec
ConsoleToMSBuild="true"
Command="dotnet build $(ProjectPath) -r win-x64 /p:CopyLocalLockFileAssemblies=false;IsNestedBuild=true --output $(Temp)" >
<Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
</Exec>
<Copy
SourceFiles="@(BootStrapFiles)"
DestinationFolder="$(OutputPath)"
/>
</Target>
Lo resumí en una muestra aquí: https://github.com/SimonCropp/NetCoreConsole
Si un archivo .bat es aceptable, puede crear un archivo bat con el mismo nombre que el archivo DLL (y colocarlo en la misma carpeta) y luego pegar el siguiente contenido:
dotnet %~n0.dll %*
Obviamente, esto supone que la máquina tiene .NET Core instalado y disponible globalmente.
c:\> "path\to\batch\file" -args blah
(Esta respuesta se deriva del comentario de Chet ).