[.net-core] EXE를 출력하는 .NET Core 콘솔 응용 프로그램 빌드

.NET Core 1.0을 대상으로하는 콘솔 응용 프로그램 프로젝트의 경우 빌드 중에 .exe를 출력하는 방법을 알 수 없습니다. 프로젝트는 디버그에서 정상적으로 실행됩니다.

프로젝트 게시를 시도했지만 작동하지 않습니다. EXE 파일은 플랫폼에 따라 다르지만 방법이 있어야합니다. 내 검색은 project.json을 사용하는 이전 .NET Core 버전에 대해서만 참조되었습니다.

내가 빌드하거나 게시 할 때마다 이것이 내가 얻는 전부입니다.

빌드 디렉토리



답변

디버깅 목적으로 DLL 파일을 사용할 수 있습니다. 를 사용하여 실행할 수 있습니다 dotnet ConsoleApp2.dll. EXE 파일을 생성하려면 독립적 인 응용 프로그램을 생성해야합니다.

자체 포함 응용 프로그램 (Windows의 EXE)을 생성하려면 대상 런타임 (대상 운영 체제에 따라 다름)을 지정해야합니다.

.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


답변

업데이트 (31-OCT-2019)

GUI를 통해이 작업을 수행하려는 사람은 다음을 수행하십시오.

  • Visual Studio 2019를 사용하고 있습니다
  • .NET Core 3.0이 설치되어 있습니다 (Visual Studio 2019 최신 버전에 포함됨)
  • 단일 파일 을 생성하려고 합니다

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

노트

작은 응용 프로그램의 경우 큰 파일 크기를 확인하십시오.

여기에 이미지 설명을 입력하십시오

“PublishTrimmed”속성을 추가 할 수 있습니다. 응용 프로그램에는 응용 프로그램에서 사용하는 구성 요소 만 포함됩니다. 주의 : 반사를 사용하는 경우이 작업을 수행하지 마십시오

여기에 이미지 설명을 입력하십시오

다시 게시

여기에 이미지 설명을 입력하십시오


이전 게시물

Visual Studio를 사용하고 있으며 GUI를 통해이 작업을 수행하려는 사람은 아래 단계를 참조하십시오.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


답변

다음은 출력 디렉토리에서 생성됩니다.

  • 모든 패키지 참조
  • 출력 어셈블리
  • bootstrapping 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 샘플로 마무리했습니다.


답변

.bat 파일이 허용되는 경우 DLL 파일과 이름이 같은 bat 파일을 만들어 같은 폴더에 배치 한 후 다음 내용을 붙여 넣을 수 있습니다.

dotnet %~n0.dll %*

분명히 이것은 컴퓨터에 .NET Core가 설치되어 있고 전 세계적으로 사용 가능한 것으로 가정합니다.

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

(이 답변은 Chet의 의견 에서 파생되었습니다 .)


답변

내 해키 해결 방법은 다음과 같습니다. 자체 이름과 인수를 읽은 다음을 호출하는 콘솔 응용 프로그램 (.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();
        }
    }
}


답변