다음을 통해 공유


네이티브 AOT 배포

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

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

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

필수 조건

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 샘플을 확인하세요. 샘플에는 필수 구성 요소 설치를 자동화하고 컨테이너를 사용하여 Native AOT를 사용하여 .NET 프로젝트를 게시하는 방법을 보여 주는 LinuxWindows Dockerfiles가 포함됩니다.

AOT 호환성 분석기

IsAotCompatible 속성은 라이브러리가 Native AOT와 호환되는지 여부를 나타내는 데 사용됩니다. 예를 들어, 라이브러리가 IsAotCompatible 속성을 true로 설정할 때를 고려합니다.

<PropertyGroup>
    <IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

위의 구성은 다음 속성의 true 기본값을 할당합니다.

  • IsTrimmable
  • EnableTrimAnalyzer
  • EnableSingleFileAnalyzer
  • EnableAotAnalyzer

이러한 분석기는 라이브러리가 Native AOT와 호환되는지 확인하는 데 도움이 될 수 있습니다.

네이티브 디버그 정보

기본적으로 네이티브 AOT 게시는 별도의 파일에 디버그 정보를 생성합니다.

  • Linux: .dbg
  • Windows: .pdb
  • macOS: .dSYM 폴더

디버그 파일은 디버거에서 앱을 실행 하거나 크래시 덤프를 검사하는 데 필요합니다. Unix와 유사한 플랫폼에서 네이티브 바이너리에 디버그 정보를 포함시키기 위해 StripSymbols 속성을 false로 설정합니다. 디버그 정보를 포함하면 네이티브 이진 파일이 커집니다.

<PropertyGroup>
    <StripSymbols>false</StripSymbols>
</PropertyGroup>

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

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

  • 예를 들어 Assembly.LoadFile동적 로드가 없습니다.
  • 예를 들어 System.Reflection.Emit런타임 코드 생성이 없습니다.
  • C++/CLI가 없습니다.
  • Windows: 기본 제공 COM이 없습니다.
  • 제한 사항이 있는 트리밍이 필요합니다.
  • 호환성이 알려진 단일 파일로 컴파일을 의미합니다.
  • 앱에는 필요한 런타임 라이브러리가 포함됩니다( 자체 포함 앱과 마찬가지로 프레임워크 종속 앱에 비해 크기가 증가함).
  • System.Linq.Expressions 는 항상 런타임에서 생성된 컴파일된 코드보다 느린 해석된 형식을 사용합니다.
  • 구조체 형식 인수로 대체된 제네릭 매개 변수에는 각 인스턴스화에 대해 생성된 특수 코드가 있습니다. 동적 런타임에서는 요청 시 많은 인스턴스화가 생성됩니다. 네이티브 AOT에서는 모든 인스턴스화가 미리 생성됩니다. 이는 애플리케이션의 디스크 크기에 큰 영향을 미칠 수 있습니다. 제네릭 가상 메서드 및 제네릭 인스턴스 메서드도 모든 구현 또는 재정의 형식에 대한 인스턴스화를 갖습니다.
  • 모든 런타임 라이브러리가 네이티브 AOT 호환성에 맞춰 완전히 주석이 달려 있는 것은 아닙니다. 즉, 런타임 라이브러리의 일부 경고는 최종 개발자가 실행할 수 없습니다.
  • 몇 가지 제한 사항이 있는 디버깅 및 프로파일링에 대한 진단 지원.
  • 일부 ASP.NET Core 기능에 대한 지원. 자세한 내용은 네이티브 AOT에 대한 ASP.NET Core 지원을 참조하세요.

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

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

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

플랫폼 지원되는 아키텍처 비고
윈도우즈 x64, Arm64
리눅스 x64, Arm64
macOS x64, Arm64
iOS Arm64 실험적 지원
iOSSimulator x64, Arm64 실험적 지원
tvOS Arm64 실험적 지원
tvOSSimulator x64, Arm64 실험적 지원
MacCatalyst x64, Arm64 실험적 지원
안드로이드 x64, Arm64 실험적, 기본 제공 Java interop 없음

Native AOT에서 특정 플랫폼을 지원하는 방법에 대한 자세한 내용은 테이블의 링크를 따르세요.