Створіть консольну програму .NET Core для виведення EXE


413

Для проектування консольного додатка, орієнтованого на .NET Core 1.0, я не можу зрозуміти, як отримати .exe для виведення під час збирання. Проект працює налагоджено.

Я спробував опублікувати проект, але і це не працює. Це має сенс, оскільки файл EXE буде орієнтований на платформу, але має бути спосіб. Мої пошукові запити виявили лише посилання на старіші версії .NET Core, які використовували project.json.

Щоразу, коли я створюю чи публікую, це все, що я отримую:

Побудувати каталог


15
Можливий дублікат VS2017 Compile NetCoreApp як EXE
Martin Ullrich

2
@geekzster будь ласка скасуйте - я знаю, що ви не відповідали на питання ОП, але ви відповіли моє, і я підозрюю, що багато інших, кажучи dotnet <path>.dll(я не думав і вводив dotnet run <path>.dllбез успіху з очевидних причин)! (Поміркувавши, було б добре, якби це було закрито на користь іншого питання, на яке є аналогічний набір відповідей)
Рубен Бартелінк,

Відповіді:


480

Для налагодження можна використовувати файл DLL. Ви можете запустити його за допомогою dotnet ConsoleApp2.dll. Якщо ви хочете генерувати файл EXE, вам потрібно створити автономну програму.

Щоб створити автономну програму (EXE в Windows), потрібно вказати цільовий час виконання (що характерно для операційної системи, на яку ви орієнтуєтесь).

Лише Pre-.NET Core 2.0 : По-перше, додайте ідентифікатор часу виконання цільового часу виконання у файл .csproj ( список підтримуваних RID ):

<PropertyGroup>
    <RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64</RuntimeIdentifiers>
</PropertyGroup>

Наведений вище крок більше не потрібен, починаючи з .NET Core 2.0 .

Потім встановіть бажаний час виконання, коли ви публікуєте заявку:

dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r ubuntu.16.10-x64

15
Я думаю, що це можна зробити тільки з CLI. BTW, починаючи з .net core 2, вам не потрібно встановлювати RuntimeIdentifierв csproj.
meziantou

26
чи можна це зробити для .NET Core 2.0 у Visual Studio? Або я повинен ввести ці команди вручну?
Томаш Сікора

77
Більше 60 Мб для додатка Hello world console!
шокс

13
@mikolaj Існує лише одна цільова програма "портативного". Чи є спосіб залучити всі цілі? Я все в порядку, щоб використовувати командний рядок, проте думаю, що це крок назад.
gsharp

10
Це не створює окремий виконуваний файл. Це створює виконуваний файл разом з низкою інших файлів (я маю на увазі в папці випуску). Включаючи деякі підпапки з власними файлами. Чи є спосіб створити справжній автономний виконуваний файл?
Метью

122

ОНОВЛЕННЯ (31-ОКТ-2019)

Для всіх, хто хоче це зробити за допомогою GUI та:

  • Використовується Visual Studio 2019
  • Встановлено .NET Core 3.0 (включений в останню версію Visual Studio 2019)
  • Хоче створити один файл

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

введіть тут опис зображення

Введіть тут опис зображення

Примітка

Зауважте великий розмір файлу для такого невеликого додатка

Введіть тут опис зображення

Ви можете додати властивість "PublishTrimmed". Додаток включатиме лише компоненти, які використовуються додатком. Застереження : не робіть цього, якщо ви використовуєте роздуми

Введіть тут опис зображення

Опублікуйте ще раз

Введіть тут опис зображення


Попереднє повідомлення

Для всіх, хто використовує Visual Studio і хоче це зробити через GUI, див. Кроки нижче:

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення

Введіть тут опис зображення


19
Шкода, що вихід - це купа файлів, а не лише один EXE, як старий .NET Framework.
Томаш Карбан

2
@Tomas Karban - Так було, поки я не змінив режим розгортання на "автономний" Після зміни файлу exe з'явився також у папці публікації :-)
Mariusz

@TomasKarban .NET Core не є загальним призначенням. Він спеціально розроблений для 1) розгортання хмар / контейнерів, 2) багатоплатформних. Це також повинно бути тимчасовим - це просто "швидкий" злом, поки всі .NET можна зробити відкритим кодом. Наступною загальною метою .NET 5.0 стане .NET 5.0.
Луань

3
Тим не менш, смішно, що IDE для .NET просто не підтримує найпростіший функціонал, коли ви орієнтуєтесь на .NET Core. І це те, на що кожен повинен орієнтуватися, щоб створити міжплатформенні програми командного рядка - скажімо, компілятор.
Моніку

18

Далі буде створено у вихідному каталозі:

  • всі посилання на пакет
  • вихідна збірка
  • завантажувальний exe

Але він не містить усіх збірок виконання 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>

Я обгорнув це у зразок тут: https://github.com/SimonCropp/NetCoreConsole


за винятком ($ Temp) вказує на мій C: \ Users \ ххх \ AppData \ Local \ Temp , який , очевидно , не може бути видалений / очищено - ні це adviceable зробити це
Adaptabi

1
@Aptaptabi Temp визначається як властивість на початку сценарію
Саймон

2

Якщо файл .bat прийнятний, ви можете створити bat-файл з тим самим іменем, що і файл DLL (і помістити його в ту саму папку), а потім вставити наступний вміст:

dotnet %~n0.dll %*

Очевидно, це передбачає, що машина має .NET Core встановлений і доступний у всьому світі.

c:\> "path\to\batch\file" -args blah

(Ця відповідь отримана з коментаря Чет .)


0

Ось мій хитрий спосіб вирішити - створити консольний додаток (.NET Framework), який читає власне ім’я та аргументи, а потім дзвонить dotnet [nameOfExe].dll [args].

Звичайно, це передбачає, що .NET встановлений на цільовій машині.

Ось код. Сміливо копіюйте!

using System;
using System.Diagnostics;
using System.Text;

namespace dotNetLauncher
{
    class Program
    {
        /*
            If you make .NET Core applications, they have to be launched like .NET blah.dll args here
            This is a convenience EXE file that launches .NET Core applications via name.exe
            Just rename the output exe to the name of the .NET Core DLL file you wish to launch
        */
        static void Main(string[] args)
        {
            var exePath = AppDomain.CurrentDomain.BaseDirectory;
            var exeName = AppDomain.CurrentDomain.FriendlyName;
            var assemblyName = exeName.Substring(0, exeName.Length - 4);
            StringBuilder passInArgs = new StringBuilder();
            foreach(var arg in args)
            {
                bool needsSurroundingQuotes = false;
                if (arg.Contains(" ") || arg.Contains("\""))
                {
                    passInArgs.Append("\"");
                    needsSurroundingQuotes = true;
                }
                passInArgs.Append(arg.Replace("\"","\"\""));
                if (needsSurroundingQuotes)
                {
                    passInArgs.Append("\"");
                }

                passInArgs.Append(" ");
            }
            string callingArgs = $"\"{exePath}{assemblyName}.dll\" {passInArgs.ToString().Trim()}";

            var p = new Process
            {
                StartInfo = new ProcessStartInfo("dotnet", callingArgs)
                {
                    UseShellExecute = false
                }
            };

            p.Start();
            p.WaitForExit();
        }
    }
}

6
Якщо ви все одно матимете додатковий файл, то чому б просто не створити файл bat, який міститьdotnet [nameOfExe].dll %*
Чет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.