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