development

EXE를 출력하기 위해 .NET Core 콘솔 응용 프로그램을 빌드 하시겠습니까?

big-blog 2020. 2. 29. 15:24
반응형

EXE를 출력하기 위해 .NET Core 콘솔 응용 프로그램을 빌드 하시겠습니까?


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

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

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

빌드 디렉토리


디버깅 목적으로 dll 파일을 사용할 수 있습니다. 를 사용하여 실행할 수 있습니다 dotnet ConsoleApp2.dll. exe를 생성하려면 자체 포함 된 응용 프로그램을 생성해야합니다.

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

.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

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

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

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

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

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

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

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

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


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

  • 모든 패키지 참조
  • 출력 어셈블리
  • 부트 스트랩 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 샘플에 싸서


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

dotnet %0.dll %*

분명히 이것은 컴퓨터에 .NET Core가 설치되어 있다고 가정합니다.

'.bat'부분없이 호출하십시오. 즉 : c:\>"path\to\program" -args blah(이 답변은 Chet의 의견에서 파생되었습니다)


내 해키 해결 방법은 다음과 같습니다. 자체 이름과 인수를 읽은 다음 호출하는 콘솔 응용 프로그램 (.NET Framework)을 생성하십시오. dotnet [nameOfExe].dll [args]

물론 이것은 대상 컴퓨터에 닷넷이 설치되어 있다고 가정합니다.

코드는 다음과 같습니다. 자유롭게 복사하십시오!

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();
        }
    }
}

참고 : https://stackoverflow.com/questions/44074121/build-net-core-console-application-to-output-an-exe



반응형