EXE를 출력하는 .NET Core 콘솔 응용 프로그램 빌드


413

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

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

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

빌드 디렉토리



2
삭제를 취소하십시오 @geekzster - 난 당신이 OP의 질문에 대답 didnt가 알고있는,하지만 당신은 내 대답 내가 말함으로써 많은 사람들의 의심 dotnet <path>.dll(내가 생각하고 입력되지 않은 dotnet run <path>.dll분명한 이유 성공하지를)! (반사시 비슷한 답변이있는 다른 질문에 찬성하여 마감하면 좋을 것입니다)
Ruben Bartelink

답변:


480

디버깅 목적으로 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

15
나는 이것이 CLI를 통해서만 가능하다고 생각합니다. BTW는 .net core 2부터 RuntimeIdentifiercsproj에서 설정하지 않아도됩니다 .
meziantou

26
.NET Core 2.0의 경우 Visual Studio에서이 작업을 수행 할 수 있습니까? 아니면이 명령을 직접 입력해야합니까?
Tomasz Sikora

77
Hello world 콘솔 앱의 경우 60MB 이상!
shox

13
@mikolaj 하나의 대상 런타임 "휴대용"이 있습니다. 모든 목표물을 가져올 수있는 방법이 있습니까? 커맨드 라인을 사용해도 괜찮지 만 한 걸음 물러 났다고 생각하십시오.
gsharp

10
이것은 독립형 실행 파일을 생성하지 않습니다. 이것은 다른 파일의 호스트와 함께 실행 파일을 만듭니다 (즉, 릴리스 폴더에 있음). 자체 파일이있는 일부 하위 폴더 포함 진정한 독립 실행 실행 파일 을 만드는 방법이 있습니까?
Matthew

122

업데이트 (31-OCT-2019)

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

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

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

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

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

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

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

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

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

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

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

노트

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

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

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

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

다시 게시

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


이전 게시물

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

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

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

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

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

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

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

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


19
출력이 너무 나쁘면 이전 .NET Framework와 같은 하나의 EXE가 아닌 많은 파일이 있습니다.
Tomas Karban

2
@Tomas Karban-배포 모드를 "자체 포함"으로 변경하기 전까지는 변경되었습니다. 변경 후 exe 파일도 게시 폴더에 나타납니다 :-)
Mariusz

@TomasKarban .NET Core는 범용 런타임이 아닙니다. 1) 클라우드 / 컨테이너 배포, 2) 다중 플랫폼을 위해 특별히 설계되었습니다. 또한 일시적인 의미가 있습니다. 모든 .NET을 공개 소스로 만들 수있을 때까지는 "빠른"해킹입니다. .NET 5.0은 차세대 범용 .NET이 될 것입니다.
Luaan

3
그러나 .NET 용 IDE가 .NET Core를 대상으로 할 때 가장 기본적인 기능을 지원하지 않는다는 것은 우스운 일입니다. 이것이 바로 플랫폼 간 명령 줄 응용 프로그램 (예 : 컴파일러)을 만들기 위해 모든 사람이 목표로해야하는 것입니다.
복원 Monica Monica

18

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

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


($ Temp)를 제외하고는 c : \ Users \ xxx \ AppData \ Local \ Temp를 가리키고 있습니다. 이것은 분명히 제거 / 청소할 수 없으며 그렇게하는 것이 좋습니다
Adaptabi

1
@Adaptabi Temp는 스크립트 시작시 속성으로 정의됩니다
Simon

2

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

dotnet %~n0.dll %*

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

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

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


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 %*
Chet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.