Подтвердить что ты не робот

Создать консольное приложение .NET Core для вывода EXE?

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

Я попытался опубликовать проект, но это тоже не работает. Имеет смысл, поскольку .exe будет специфичным для платформы, но должен быть способ. В моих поисках появилась ссылка только на старые версии .Net Core, в которых используется project.json.

Всякий раз, когда я строю или публикую, это все, что я получаю.

build directory

4b9b3361

Ответ 1

В целях отладки вы можете использовать файл DLL. Вы можете запустить его с помощью dotnet ConsoleApp2.dll. Если вы хотите сгенерировать исполняемый файл, вы должны сгенерировать автономное приложение.

Чтобы сгенерировать автономное приложение (например, в Windows), вы должны указать целевую среду выполнения (которая зависит от целевой ОС).

Pre- Только для .NET Core 2.0: сначала добавьте идентификатор времени выполнения целевых сред выполнения в csproj (список поддерживаемых ридов):

<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

Ответ 2

Для тех, кто использует Visual Studio и хочет сделать это через графический интерфейс, см. шаги ниже:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Ответ 3

Следующее будет производить в выходной каталог,

  • все ссылки на пакеты
  • выходная сборка
  • загрузочный exe

Но не содержит всех сборок среды выполнения Netcore

<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

Ответ 4

Если файл .bat приемлем, вы можете создать файл bat с тем же именем, что и у dll (и поместить его в ту же папку), а затем вставить следующее содержимое:

dotnet %0.dll %*

Очевидно, это предполагает, что на машине установлен .NET Core.

Назовите это без части .bat. то есть: c:\>"path\to\program" -args blah (этот ответ получен из комментария Чет)

Ответ 5

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

Конечно, это предполагает, что dotnet установлен на целевой машине.

Здесь код, не стесняйтесь копировать!

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

namespace dotNetLauncher
{
    class Program
    {
        /*
            If you make .net core apps, they have to be launched like dotnet blah.dll args here
            This is a convenience exe that launches .net core apps via name.exe
            Just rename the output exe to the name of the .net core dll 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

Создайте новый проект: Create New Project Вам нужны шаблоны с надписью (.NET Framework), а не (.NET Core) или (.NET Standard).

Ответ 7

Так что это мой ответ. Я пытался использовать консольное приложение "ядро".NET, чтобы получить исполняемый файл. Консольные приложения .NET Core будут работать на Linux, MAC и Windows.

Поэтому вместо того, чтобы создавать свой проект как консольное приложение .NET Core, я создал консольное приложение .NET " Framework ".

Консольное приложение .NET Framework создает исполняемый файл.

Я не уверен, что это ответ на ваш вопрос, но это решение, которое я искал. Надеюсь, это поможет всем, у кого в будущем возникла та же проблема, что и у меня.