콘텐츠로 이동

.NET Native AOT 컴파일

Native AOT(Ahead-Of-Time)는 .NET 앱을 완전한 네이티브 실행 파일로 미리 컴파일하는 방식입니다. .NET 7부터 정식 지원됩니다.

기존 .NET 실행 흐름:

C# 소스 → IL 코드 → [런타임에 JIT] → 네이티브 코드

Native AOT 흐름:

C# 소스 → IL 코드 → [빌드 시 AOT] → 네이티브 실행 파일 (런타임 불필요)
.csproj
<PropertyGroup>
<PublishAot>true</PublishAot>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
Terminal window
dotnet publish -c Release
항목JITNative AOT
시작 시간느림 (워밍업 필요)매우 빠름
메모리 사용큼 (런타임 포함)작음
실행 파일 크기런타임 별도단일 파일, 수 MB
최대 성능JIT 최적화로 높음빌드 타임 최적화
배포런타임 설치 필요런타임 불필요

AOT는 사용되지 않는 코드를 트리밍(trimming)하므로 런타임 리플렉션이 제한됩니다.

// 위험: AOT에서 동작 안 할 수 있음
Type t = Type.GetType("MyNamespace.MyClass");
Activator.CreateInstance(t);
// 안전: rd.xml 또는 [DynamicallyAccessedMembers] 사용
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
void CreateInstance(Type t) { ... }
// 사용 불가
Assembly.Load(bytes);
Emit / ILGenerator
Expression.Compile() → 제한적 지원

런타임에 새 제네릭 인스턴스화가 불가하므로 일부 패턴이 제한됩니다.

rd.xml
<Directives>
<Application>
<Assembly Name="MyApp">
<Type Name="MyNamespace.MyClass" Dynamic="Required All"/>
</Assembly>
</Application>
</Directives>
Terminal window
# 시작 시간이 중요한 CLI 툴
dotnet publish -c Release -r win-x64 --self-contained
# → 수십 ms 시작, 런타임 불필요
FROM mcr.microsoft.com/dotnet/runtime-deps:8.0
COPY --from=build /app/publish /app
ENTRYPOINT ["/app/MyApp"]
# 이미지 크기 대폭 감소, 콜드 스타트 개선

.NET 8부터 ASP.NET Core도 Native AOT를 지원합니다(미니멀 API 권장).

var builder = WebApplication.CreateSlimBuilder(args); // AOT 최적화 빌더
var app = builder.Build();
app.MapGet("/", () => "Hello AOT!");
app.Run();
// 빌드 시 경고 활성화
<TrimmerRootAssembly Include="MyLib"/>
<PublishTrimmed>true</PublishTrimmed>
<TreatTrimmerWarningsAsErrors>true</TreatTrimmerWarningsAsErrors>
  • Native AOT는 시작 시간, 메모리, 배포 크기에서 큰 이점
  • 리플렉션·동적 코드 생성 의존 코드는 사전 점검 필요
  • CLI 도구, 서버리스, 컨테이너 환경에 특히 적합
  • .NET 8+에서 ASP.NET Core Minimal API도 AOT 지원
  • [DynamicallyAccessedMembers], rd.xml로 트리밍 예외 지정 가능