네이티브 AOT 배포

앱을 네이티브 AOT로 게시하면 자체 포함이며 네이티브 코드로 AOT(ahead-of-time) 컴파일된 앱이 생성됩니다. 네이티브 AOT 앱은 시작 시간이 빨라지고 메모리 공간이 더 작습니다. 이러한 앱은 .NET 런타임이 설치되지 않은 컴퓨터에서 실행할 수 있습니다.

네이티브 AOT의 이점은 클라우드 인프라 및 하이퍼스케일 서비스와 같이 배포된 인스턴스 수가 많은 워크로드에 가장 중요합니다. .NET 8은 네이티브 AOT에 ASP.NET Core 지원을 추가합니다.

네이티브 AOT 배포 모델은 AOT(ahead-of-time) 컴파일러를 사용하여 게시할 때 IL을 네이티브 코드로 컴파일합니다. 네이티브 AOT 앱은 애플리케이션이 실행될 때는 JIT(Just-In-Time) 컴파일러를 사용하지 않습니다. 네이티브 AOT 앱은 JIT가 허용되지 않는 제한된 환경에서 실행할 수 있습니다. 네이티브 AOT 애플리케이션은 자체 포함 앱을 게시하는 것과 마찬가지로 Linux x64 또는 Windows x64와 같은 특정 런타임 환경을 대상으로 합니다.

.NET 네이티브 AOT 배포 모델의 제한 사항

네이티브 AOT는 콘솔 유형 앱을 대상으로 합니다. 제한된 수의 라이브러리만 네이티브 AOT와 완전히 호환됩니다.

필수 조건

Visual Studio 2022(모든 기본 구성 요소와 함께 C++ 워크로드를 사용한 데스크톱 개발 포함).

CLI를 사용하여 네이티브 AOT 게시

  1. <PublishAot>true</PublishAot>를 프로젝트 파일에 추가합니다.

    이 속성은 게시하는 동안 네이티브 AOT 컴파일을 사용하도록 설정합니다. 또한 빌드 및 편집 중에 동적 코드 사용 현황 분석이 사용하도록 설정됩니다. 이 설정은 게시 이외의 동작을 제어하기 때문에 명령줄에 전달하는 것보다 프로젝트 파일에 두는 것이 더 좋습니다.

    <PropertyGroup>
        <PublishAot>true</PublishAot>
    </PropertyGroup>
    
  2. dotnet publish -r <RID>를 사용하여 특정 런타임 식별자에 대한 앱을 게시합니다.

    다음 예제에서는 필수 구성 요소가 설치된 컴퓨터에 Windows용 앱을 네이티브 AOT 애플리케이션으로 게시합니다.

    dotnet publish -r win-x64 -c Release

    다음 예제에서는 Linux용 앱을 네이티브 AOT 애플리케이션으로 게시합니다. Linux 컴퓨터에서 생성된 네이티브 AOT 이진 파일은 동일하거나 더 최신인 Linux 버전에서만 작동합니다. 예를 들어 Ubuntu 20.04에서 생성된 네이티브 AOT 이진 파일은 Ubuntu 20.04 이상에서 실행되지만 Ubuntu 18.04에서는 실행되지 않습니다.

    dotnet publish -r linux-arm64 -c Release

앱은 게시 디렉터리에서 사용할 수 있으며, coreclr 런타임의 저사양 버전을 포함하여 앱에서 실행하는 데 필요한 모든 코드를 포함합니다.

GitHub의 dotnet/samples 리포지토리에서 사용할 수 있는 네이티브 AOT 샘플을 확인하세요. 샘플에는 필수 구성 요소 설치를 자동화하고 컨테이너를 사용하여 네이티브 AOT로 .NET 프로젝트를 게시하는 방법을 보여 주는 LinuxWindows Dockerfiles가 포함됩니다.

AOT 호환성 분석기

AOT 호환성 분석기는 .NET 8 이상 버전에서만 사용할 수 있습니다.

네이티브 디버그 정보

네이티브 AOT 게시는 네이티브 도구 체인에 대한 플랫폼 규칙을 따릅니다. Windows에서 네이티브 도구 체인의 기본 동작은 별도의 .pdb 파일에 디버그 정보를 생성하는 것입니다. Linux의 네이티브 도구 체인의 기본 동작은 네이티브 이진 파일에 디버그 정보를 포함하여 네이티브 이진 파일을 더 크게 만드는 것입니다.

StripSymbols 속성을 true로 설정하여 디버그 정보를 별도 .dbg 파일로 생성하고 Linux의 네이티브 이진 파일에서 제외합니다. (이 속성은 Windows에 영향을 주지 않습니다.)

<PropertyGroup>
    <StripSymbols>true</StripSymbols>
</PropertyGroup>

네이티브 AOT 배포의 제한 사항

네이티브 AOT 앱에는 다음과 같은 제한 사항이 있습니다.

  • 동적 로드가 없습니다(예: Assembly.LoadFile).
  • 런타임 코드를 생성하지 않습니다(예: System.Reflection.Emit).
  • C++/CLI 사용 안 함.
  • Windows: 기본 제공 COM이 없습니다.
  • 제한 사항이 있는 트리밍이 필요합니다.
  • 알려진 비호환성이 있는 단일 파일로 컴파일됨을 의미합니다.
  • 앱에는 필요한 런타임 라이브러리(자체 포함 앱과 같으며 프레임워크 종속 앱과 비교할 때 크기가 증가함)가 포함되어 있습니다.
  • System.Linq.Expressions는 항상 런타임에서 생성된 컴파일된 코드보다 느린 해석된 형식을 사용합니다.
  • 네이티브 AOT와 호환되도록 모든 런타임 라이브러리에 완전히 주석이 추가된 것은 아닙니다. 즉, 런타임 라이브러리의 일부 경고는 최종 개발자가 실행할 수 없습니다.

게시 프로세스는 전체 프로젝트 및 해당 종속성을 분석하여 가능한 제한 사항을 확인합니다. 게시된 앱이 런타임 시에 직면할 수 있는 각 제한 사항에 대해 경고가 발생합니다.

버전별 제한 사항

  • 콘솔 유형 앱을 대상으로 해야 합니다. ASP.NET Core는 지원되지 않습니다.
  • 디버깅 및 프로파일링에 대한 제한된 진단 지원.

네이티브 라이브러리 빌드

.NET 클래스 라이브러리를 네이티브 AOT로 게시하면 .NET이 아닌 프로그래밍 언어에서 사용할 수 있는 라이브러리를 만들 수 있습니다. 생성된 네이티브 라이브러리는 자체 포함 형식이며 .NET 런타임을 설치할 필요가 없습니다.

클래스 라이브러리를 네이티브 AOT로 게시하면 null이 아닌 EntryPoint 필드와 함께 UnmanagedCallersOnlyAttribute 주석이 추가된 클래스 라이브러리 메서드를 노출하는 네이티브 라이브러리가 만들어집니다. 자세한 내용은 GitHub의 dotnet/samples 리포지토리에서 사용할 수 있는 네이티브 라이브러리 샘플을 참조하세요.

플랫폼/아키텍처 제한 사항

다음 표에서는 지원되는 컴파일 대상을 보여 줍니다.

플랫폼 지원되는 아키텍처
Windows x64, Arm64
Linux x64, Arm64