.NET 애플리케이션 게시 개요

.NET을 사용하여 만든 애플리케이션은 두 가지 모드로 게시할 수 있으며, 모드에 따라 사용자가 앱을 실행하는 방법에 영향을 줍니다.

앱을 ‘자체 포함’으로 게시하면 .NET 런타임 및 라이브러리와 해당 애플리케이션 및 관련 종속성을 포함하는 애플리케이션이 생성됩니다. 애플리케이션 사용자는 .NET 런타임이 설치되지 않은 머신에서 실행 파일을 실행할 수 있습니다.

앱을 프레임워크 종속으로 게시하면 애플리케이션 자체와 관련 종속성만 포함하는 애플리케이션이 생성됩니다. 애플리케이션 사용자가 .NET 런타임을 별도로 설치해야 합니다.

두 게시 모드 모두 기본적으로 플랫폼별 실행 파일을 생성합니다. 프레임워크 종속 애플리케이션은 실행 파일 없이 만들 수 있으며 이 경우 플랫폼 간 애플리케이션입니다.

실행 파일을 생성할 때 RID(런타임 식별자)로 대상 플랫폼을 지정할 수 있습니다. RID에 대한 자세한 내용은 .NET RID 카탈로그를 참조하세요.

다음 표에서는 앱을 프레임워크 종속 또는 자체 포함으로 게시하는 데 사용되는 명령을 간략하게 설명합니다.

Type 명령
현재 플랫폼용 프레임워크 종속 실행 파일 dotnet publish
특정 플랫폼용 프레임워크 종속 실행 파일 dotnet publish -r <RID>
프레임워크 종속 이진 dotnet publish
자체 포함 실행 파일 dotnet publish -r <RID> --self-contained

자세한 내용은 .NET dotnet publish 명령을 참조하세요.

실행 파일 생성

실행 파일은 플랫폼 간이 아니며 운영 체제 및 CPU 아키텍처와 관련이 있습니다. 앱을 게시하고 실행 파일을 만들 때 앱을 자체 포함 또는 프레임워크 종속으로 게시할 수 있습니다. 앱을 자체 포함으로 게시하면 .NET 런타임이 앱에 포함되며 앱 사용자는 .NET을 설치하지 않고도 앱을 실행할 수 있습니다. 프레임워크 종속으로 앱을 게시하면 .NET 런타임은 포함되지 않습니다. 앱 및 타사 종속성만 포함됩니다.

실행 파일을 생성하는 명령은 다음과 같습니다.

Type 명령
현재 플랫폼용 프레임워크 종속 실행 파일 dotnet publish
특정 플랫폼용 프레임워크 종속 실행 파일 dotnet publish -r <RID>
자체 포함 실행 파일 dotnet publish -r <RID> --self-contained

플랫폼 간 이진 파일을 생성합니다.

플랫폼 간 이진 파일은 앱을 프레임워크 종속으로 게시할 때 dll 파일 형식으로 생성됩니다. dll 파일 이름은 프로젝트 이름을 따라 지정됩니다. 예를 들어 앱 이름이 word_reader이면 word_reader.dll이라는 파일이 만들어집니다. 이러한 방식으로 게시된 앱은 dotnet <filename.dll> 명령으로 실행되며 모든 플랫폼에서 실행할 수 있습니다.

플랫폼 간 이진 파일은 대상 .NET 런타임이 이미 설치되어 있는 경우 모든 운영 체제에서 실행할 수 있습니다. 대상 .NET 런타임이 설치되지 않았더라도 앱이 롤포워드되도록 구성된 경우 최신 런타임을 사용하여 앱을 실행할 수 있습니다. 자세한 내용은 프레임워크 종속 앱 롤포워드를 참조하세요.

플랫폼 간 이진 파일을 생성하는 명령은 다음과 같습니다.

Type 명령
프레임워크 종속 플랫폼 간 이진 파일 dotnet publish

프레임워크 종속 게시

프레임워크 종속으로 게시된 앱은 플랫폼 간이며 .NET 런타임을 포함하지 않습니다. 앱 사용자는 .NET 런타임을 설치해야 합니다.

프레임워크 종속으로 앱을 게시하면 플랫폼 간 이진 파일dll 파일로 생성되며 현재 플랫폼을 대상으로 하는 플랫폼별 실행 파일이 생성됩니다. dll은 플랫폼 간 이지만 실행 파일은 그렇지 않습니다. 예를 들어 word_reader라는 앱을 게시하고 Windows를 대상으로 지정하면 word_reader.exe 실행 파일이 word_reader.dll과 함께 만들어집니다. Linux 또는 macOS를 대상으로 지정하는 경우에는 word_reader 실행 파일이 word_reader.dll과 함께 만들어집니다. 앱에서 플랫폼별 구현이 있는 NuGet 패키지를 사용하는 경우 모든 플랫폼에 대한 종속성이 publish\runtimes\{platform} 폴더에 복사됩니다.

앱의 플랫폼 간 이진 파일은 dotnet <filename.dll> 명령으로 실행하며 모든 플랫폼에서 실행할 수 있습니다.

플랫폼별 및 프레임워크 종속

dotnet publish 명령에 -r <RID> 매개 변수를 전달하여 플랫폼별 프레임워크 종속 앱을 게시할 수 있습니다. 이러한 방식으로 게시하는 것은 플랫폼별 종속성이 다르게 처리된다는 점을 제외하고 프레임워크 종속 게시와 동일합니다. 앱이 플랫폼별 구현이 있는 NuGet 패키지를 사용하는 경우 대상 플랫폼의 종속성만 복사됩니다. 이러한 종속성은 게시 폴더에 직접 복사됩니다.

기술적으로 생성된 이진 파일은 플랫폼 간이지만 특정 플랫폼을 대상으로 하면 앱이 플랫폼 간에 실행된다는 보장은 없습니다. dotnet <filename.dll>을 실행할 수 있지만 누락된 플랫폼별 종속성에 액세스하려고 하면 앱이 충돌할 수 있습니다.

RID에 대한 자세한 내용은 .NET RID 카탈로그를 참조하세요.

장점

  • 소규모 배포
    앱과 해당 종속성만 배포됩니다. .NET 런타임 및 라이브러리는 사용자가 설치하며 모든 앱에서 런타임을 공유합니다.

  • 플랫폼 간
    앱과 모든 NET 기반 라이브러리가 다른 운영 체제에서 실행됩니다. 앱의 대상 플랫폼을 정의할 필요가 없습니다. .NET 파일 형식에 대한 자세한 내용은 .NET 어셈블리 파일 형식을 참조하세요.

  • 패치된 최신 런타임 사용
    앱은 대상 시스템에 설치된 최신 런타임(대상 .NET 주/부 제품군 내에 있음)을 사용합니다. 즉, 앱에서 패치된 최신 버전의 .NET 런타임을 자동으로 사용합니다. 이 기본 동작은 재정의할 수 있습니다. 자세한 내용은 프레임워크 종속 앱 롤포워드를 참조하세요.

단점

  • 런타임을 미리 설치해야 함
    앱에서 대상으로 지정한 .NET 버전이 호스트 시스템에 이미 설치된 경우에만 앱을 실행할 수 있습니다. 앱에서 특정 버전의 .NET을 요구하거나 최신 버전의 .NET을 허용하도록 롤포워드 동작을 구성할 수 있습니다. 자세한 내용은 프레임워크 종속 앱 롤포워드를 참조하세요.

  • .NET이 변경될 수 있음
    앱이 실행되는 머신에서 .NET 런타임 및 라이브러리가 업데이트될 수 있습니다. 드문 경우이지만 이로 인해 대부분의 앱에서처럼 .NET 라이브러리를 사용하는 경우 앱의 동작이 변경될 수 있습니다. 앱이 최신 버전의 .NET을 사용하는 방법을 구성할 수 있습니다. 자세한 내용은 프레임워크 종속 앱 롤포워드를 참조하세요.

예제

플랫폼 간 및 프레임워크 종속으로 앱을 게시합니다. 현재 플랫폼을 대상으로 하는 실행 파일이 dll 파일과 함께 만들어집니다. 모든 플랫폼별 종속성은 앱과 함께 게시됩니다.

dotnet publish

앱을 플랫폼별 및 프레임워크 종속 앱으로 게시합니다. Linux 64비트 실행 파일이 dll 파일과 함께 만들어집니다. 대상 플랫폼의 종속성만 앱과 함께 게시됩니다.

dotnet publish -r linux-x64

자체 포함 게시

앱을 자체 포함으로 게시하면 플랫폼별 실행 파일이 생성됩니다. 출력 게시 폴더에는 .NET 라이브러리 및 대상 런타임을 포함하여 앱의 모든 구성 요소가 포함됩니다. 앱은 다른 .NET 앱에서 격리되며 로컬로 설치된 공유 런타임을 사용하지 않습니다. 앱 사용자는 .NET을 다운로드하여 설치할 필요가 없습니다.

dotnet publish 명령에 --self-contained 매개 변수를 전달하여 자체 포함 앱을 게시할 수 있습니다. 지정된 대상 플랫폼의 이진 실행 파일이 생성됩니다. 예를 들어 앱의 이름이 word_reader이고 Windows용 자체 포함 실행 파일을 게시하는 경우 word_reader.exe 파일이 생성됩니다. Linux 또는 macOS용으로 게시하면 word_reader 파일이 생성됩니다. 대상 플랫폼과 아키텍처는 dotnet publish 명령의 -r <RID> 매개 변수로 지정합니다. RID에 대한 자세한 내용은 .NET RID 카탈로그를 참조하세요.

앱에 플랫폼별 종속성이 포함된 NuGet 패키지와 같은 플랫폼별 종속성이 있는 경우 해당 종속성이 앱과 함께 게시 폴더에 복사됩니다.

장점

  • .NET 버전 제어
    앱과 함께 배포되는 .NET 버전을 제어할 수 있습니다.

  • 플랫폼별 대상 지정
    각 플랫폼용 앱을 게시해야 하므로 앱이 실행되는 위치를 알 수 있습니다. .NET에서 새 플랫폼을 도입하는 경우 해당 플랫폼을 대상으로 하는 버전을 릴리스할 때까지 사용자가 해당 플랫폼에서 앱을 실행할 수 없습니다. 사용자가 새 플랫폼에서 앱을 실행하기 전에 앱의 호환성 문제를 테스트할 수 있습니다.

단점

  • 대규모 배포
    앱에는 .NET 런타임 및 모든 앱 종속성이 포함되어 있으므로 필요한 다운로드 크기와 하드 드라이브 공간이 프레임워크 종속 버전보다 큽니다.

    .NET globalization invariant mode(세계화 고정 모드)를 사용하여 Linux 시스템에서 배포 크기를 약 28MB까지 줄일 수 있습니다. 이렇게 하면 앱이 모든 문화권을 고정 문화권처럼 처리합니다.

    IL 트리밍을 통해 배포 크기를 더 줄일 수 있습니다.

  • .NET 버전을 업데이트하기 어려움
    앱과 함께 배포되는 .NET 런타임은 새 버전의 앱을 릴리스해야만 업그레이드할 수 있습니다.

예제

앱을 자체 포함으로 게시합니다. macOS 64비트 실행 파일이 생성됩니다.

dotnet publish -r osx-x64 --self-contained

앱을 자체 포함으로 게시합니다. Windows 64비트 실행 파일이 생성됩니다.

dotnet publish -r win-x64 --self-contained

ReadyToRun 이미지를 사용하여 게시

ReadyToRun 이미지를 사용하여 게시하면 애플리케이션의 크기를 늘리는 데 드는 비용으로 애플리케이션의 시작 시간이 향상됩니다. 자세한 내용은 ReadyToRun을 참조하세요.

장점

  • 시작 시간 향상
    애플리케이션은 JIT를 실행하는 데 걸리는 시간을 줄입니다.

단점

  • 큰 크기
    애플리케이션은 디스크에서 더 커집니다.

예제

자체 포함 및 ReadyToRun 앱을 게시합니다. macOS 64비트 실행 파일이 생성됩니다.

dotnet publish -c Release -r osx-x64 --self-contained -p:PublishReadyToRun=true

자체 포함 및 ReadyToRun 앱을 게시합니다. Windows 64비트 실행 파일이 생성됩니다.

dotnet publish -c Release -r win-x64 --self-contained -p:PublishReadyToRun=true

참고 항목