77 votes

VS2017 compiler NetCoreApp en tant que fichier EXE

J'ai créé un NetCoreApp (v1.1) dans Visual Studio 2017. Lorsque je le compile, une DLL est produite à la place du fichier EXE attendu pour le projet généré. J'ai vérifié le fichier csproj et confirmé que le type de sortie est défini sur exe , mais pas de dés.

Des idées pour lesquelles VS2017 produit toujours une DLL? Je suis sûr que c'est un réglage rapide quelque part que j'ai oublié ... c'est aussi 1 heure du matin. :)

 <Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Core.EF.SqlServer\Core.EF.SqlServer.csproj" />
  </ItemGroup>

</Project>
 

106voto

Martin Ullrich Points 5894

.NET applications de Base sont censés être .dllfichiers. OutputType ensemble de Exe dans ce cas signifie "exécutable" et fait tout le nécessaire pour s'assurer que la sortie est praticable (point d'entrée de Main() méthode, .runtimeconfig.json le fichier). La résultante de fichier dll est destiné à être exécuté à l'aide de:

dotnet yourapp.dll 

Ce fichier dll fonctionne sur toutes les plates-formes prises en charge par l' .net de base d'exécution (windows, linux, macOS). Ceci est appelé un "portable" ou "cadre à charge" de déploiement.

Si vous voulez vraiment un .exe fichier, pensez à l'auto-contenue déploiements. Cela permettra de créer une sortie qui contient sa propre copie de l' .net de base d'exécution et un yourapp.exe de fichiers, mais il augmente aussi la taille de l'application doit être publiée et il doit être mis à jour lorsque de nouvelles versions du moteur d'exécution sont libérés. Aussi, le résultat de l'application ne fonctionne que sur le système d'exploitation publié pour.

Reportez-vous à .NET de Base déploiement de l'application pour plus de détails sur les options de déploiement, et comment les mettre en place.

64voto

KeMik Points 89

dans VS2017

  1. Clic droit sur votre projet et sélectionnez Publier
  2. Sélectionnez "Dossier" pour créer un nouveau profil
  3. Dans l'onglet "Publier" sur à " Configurer...'
  4. Sélectionnez Mode de Déploiement: Autonome, d'Exécution Cible: win-x86 (ou win-x64)
  5. Enregistrer
  6. Publier

dans le dossier \bin\Debug\netcoreapp2.1\win-x86\, vous verrez fichier EXE

Publish settings

7voto

Marcell Toth Points 1334

En commençant avec .NET Core 2.2, vous pouvez construire un Cadre Dépendante des Exécutables

Bien que la construction d'une de Déploiement peut être une bonne solution, il a ses propres inconvénients. (Voir R. Titov et Martin Ullrichs réponses sur DCG-s).

Heureusement .NET Core 2.2 prend en charge la construction de ce qu'on appelle Cadre Dépendante de l'Exécutable-s, qui sont essentiellement un wrapper binaire (.exe sur windows) autour de la norme de dll-s.

De cette façon, vous avez tous les avantages (et les inconvénients) de la norme-Cadre-Dépendante de Déploiement (de nouveau, voir Martin de réponse), mais vous avez un moyen pratique de lancer, sans avoir à l'appeler par le biais de la dotnet CLI.

Vous pouvez publier votre application en tant que Cadre-Dépendante de l'Exécutable à l'aide de la syntaxe suivante:

dotnet publish -c Release -r <RID> --self-contained false

Où en DÉBARRASSER est l'habitude d'exécution identitfier, par exemple, win-x64 ou quelle que soit la plateforme que vous souhaitez construire (voir le catalogue).

1voto

smax Points 191

C'est comment vous le faites autonome de publier avec une ligne de commande dans tous les systèmes d'exploitation: dotnet publier C:\src\App\App.csproj -c -r win-x64 -s de sortie-win-x64

En outre, vous voudrez peut-être obtenir la production a diminué de ~60 mo pour un simple Hello World app ~30 mo en utilisant ILLink.

Aussi, vous voudrez peut-être aller plus loin et obtenir un seul .exe fichier d'une taille à environ 5 mo et l'utilisation ILCompiler. Voir cette réponse.

0voto

zespri Points 6865

Les autres réponses sont bonnes, mais ce que je trouve parfois pratique est:

  • Pas autonome car la machine cible est susceptible d'avoir .net de base de la bonne version installée. Cela permet de réduire le nombre de la dll j'ai besoin de navire.
  • Ne pas avoir à spécifier dotnet sur la ligne de commande

Pour cela, une chauve-souris de fichier wrapper peut être utilisé semblable à ces lignes:

@ECHO OFF
REM see http://joshua.poehls.me/powershell-batch-file-wrapper/

SET SCRIPTNAME=%~d0%~p0%~n0.dll
SET ARGS=%*

dotnet "%SCRIPTNAME%" %ARGS%
EXIT /B %ERRORLEVEL%

Si votre application se termine en yourapp.dll nom de fichier bat, yourapp.bat et le placer à côté de la dll. Maintenant, au lieu de dotnet yourapp.dll params vous pouvez appeler yourapp params

Noter que le contexte de cette réponse est dans la maison de l'outillage, de sorte que tous les devs à l'aide de l'utilitaire d'avoir assez standard dev installation de la machine. Si c'est pour être distribués à des clients externes qui exécute et qui sait ce sur leurs boîtes, l'auto-contenue option est de loin supérieure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X