.NET Native AOT 컴파일
Native AOT란
섹션 제목: “Native AOT란”Native AOT(Ahead-Of-Time)는 .NET 앱을 완전한 네이티브 실행 파일로 미리 컴파일하는 방식입니다. .NET 7부터 정식 지원됩니다.
기존 .NET 실행 흐름:
C# 소스 → IL 코드 → [런타임에 JIT] → 네이티브 코드Native AOT 흐름:
C# 소스 → IL 코드 → [빌드 시 AOT] → 네이티브 실행 파일 (런타임 불필요)설정 방법
섹션 제목: “설정 방법”<PropertyGroup> <PublishAot>true</PublishAot> <RuntimeIdentifier>win-x64</RuntimeIdentifier></PropertyGroup>dotnet publish -c ReleaseJIT 대비 장점
섹션 제목: “JIT 대비 장점”| 항목 | JIT | Native 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 / ILGeneratorExpression.Compile() → 제한적 지원제네릭 제약
섹션 제목: “제네릭 제약”런타임에 새 제네릭 인스턴스화가 불가하므로 일부 패턴이 제한됩니다.
rd.xml로 보존 지정
섹션 제목: “rd.xml로 보존 지정”<Directives> <Application> <Assembly Name="MyApp"> <Type Name="MyNamespace.MyClass" Dynamic="Required All"/> </Assembly> </Application></Directives>활용 사례
섹션 제목: “활용 사례”CLI 도구
섹션 제목: “CLI 도구”# 시작 시간이 중요한 CLI 툴dotnet publish -c Release -r win-x64 --self-contained# → 수십 ms 시작, 런타임 불필요서버리스 / 컨테이너
섹션 제목: “서버리스 / 컨테이너”FROM mcr.microsoft.com/dotnet/runtime-deps:8.0COPY --from=build /app/publish /appENTRYPOINT ["/app/MyApp"]# 이미지 크기 대폭 감소, 콜드 스타트 개선gRPC / Web API
섹션 제목: “gRPC / Web API”.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로 트리밍 예외 지정 가능