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
'development' 카테고리의 다른 글
"심볼을 찾을 수 없음"컴파일 오류는 무엇을 의미합니까? (0) | 2020.02.29 |
---|---|
Microsoft .NET 4.0 전체 프레임 워크와 클라이언트 프로파일의 차이점 (0) | 2020.02.29 |
빈 Pandas DataFrame을 만든 다음 채우시겠습니까? (0) | 2020.02.29 |
AngularJS 컨트롤러간에 데이터 공유 (0) | 2020.02.29 |
바이트 + 바이트 = int… 왜? (0) | 2020.02.29 |