Cree una aplicación de consola .NET Core para generar un EXE

Resuelto kenchilada asked hace 7 años • 5 respuestas

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:

Directorio de compilación

kenchilada avatar May 19 '17 22:05 kenchilada
Aceptado

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
meziantou avatar May 19 '2017 15:05 meziantou

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

  1. 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

  1. Haga clic derecho en Proyecto y haga clic en Publicar
    ingrese la descripción de la imagen aquí

  2. Haga clic en Inicio y elija Carpeta de destino, haga clic en Siguiente y elija Carpeta Elija la carpeta de destino

  3. Ingrese cualquier ubicación de carpeta y haga clic en Finalizar

  4. Haga clic en Editar
    ingrese la descripción de la imagen aquí

  5. Elija un tiempo de ejecución de destino y marque Producir archivo único y guarde.* ingrese la descripción de la imagen aquí

  6. Haga clic en Publicar

  7. Abra una terminal en la ubicación donde publicó su aplicación y ejecute el archivo .exe. Ejemplo: ingrese la descripción de la imagen aquí

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


Francisco Vilches avatar Apr 20 '2019 16:04 Francisco Vilches

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

Simon avatar Oct 04 '2018 01:10 Simon

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 ).

Ambrose Leung avatar Feb 28 '2019 00:02 Ambrose Leung