.NET 7 Native AOT 지원에 대한 생각

.NET 7에는 Native AOT를 콘솔 프로젝트에서 사용할 수 있게 됩니다. 점진적으로 ASP.NET Core 프로젝트에도 적용될 것으로 보입니다.

현재 OS가 없는 아두이노 등의 SBC에는 .NET으로 개발이 제한되거나 .NET nanoframework을 이용할 수 밖에 없는데요, 특히 Raspberry Pi Pico는 아직까지는 공식적으로 .NET nanoframework에서 지원하지 않는 듯 합니다.

하지만 Native AOT로 컴파일 할 수 있게 되면 인터프리터 방식이 아니라 바로 동작하는 이진 코드를 생성할 수 있기 때문에 기대가 되는 점입니다. (물론 SBC의 부트로더가 준비되어야 겠지만)

관련해서 경쟁자일 수 있는 MicroPython가 존재하지만 OS가 없는 SBC 시장에서 .NET C#이 충분히 메리트가 있을 것이라 기대해봅니다.

9개의 좋아요

저는 지원에 대해서는 상당히 긍정적입니다.

우선 AOT라서 자체포함이 메리트인 점이 크다고 생각되기 때문입니다.

.NET Framework 4.7.2까지는 Windows 10을 설치하면 기본으로 설치되는 것으로 알고 있으나, .NET Core 이상의 .NET은 따로 설치를 해줘야 .NET 프로그램을 돌릴 수 있을테니까요.

따라서 C#의 언어의 장점을 가져오면서 AOT일 때의 장점도 챙길 수 있으면 좋은 거 같습니다.


그리고 혹시나 해서 AOT면 동적인게 안되는거 아닌가, IL이 있기 때문에 편한 것들이 꽤 있는데.

라고 생각해서 봤더니 제약사항이 존재하네요 역시…ㅠㅠ

다른 리플렉션은 그렇다치더라도, Attribute를 못 쓰는 건 좀 안타까울 것 같습니다. (Attribute가 기본적으로 리플렉션에 기반한거라고 알고 있기 때문에)

이것 때문에 필요한 분만 쓰실 지도…

3개의 좋아요

역시 제약사항이 존재했군여 .,

2개의 좋아요

네…어쩔수가없는 …ㅋㅋ 그런데 그럼 Native AOT로 개발하면 IL Spy로 못까는건지도 궁금해지네요.

2개의 좋아요

네 안됩니다.

3개의 좋아요

Attribute 사용은 제약사항이 아닙니다. Attribute에 대한 메타 정보는 컴파일 시점에서 생성되기 때문인데요, 저도 직접 확인하지 않고서 확신할 수는 없으므로 간단히 Native AOT로 코드를 컴파일 해 보았습니다.

var customAttribute = Attribute.GetCustomAttributes(typeof(CustomAttribute))
    .Where(x => x is CustomAttribute).FirstOrDefault() as CustomAttribute;
Console.WriteLine(customAttribute!.Name);

[Custom(Name = nameof(CustomAttribute))]
class CustomAttribute : Attribute
{
    public string Name { get; set; } = "Default";
}

| 출력 결과
image

인상깊었던 것은 뭐 작은 프로그램이라 하더라도 의존성 없는 3Mb 실행파일을 생성한다는 점!

7개의 좋아요

참고로 게시할 때 link.exe를 사용하기 때문에 C++를 사용한 데스크톱 개발 워크로드도 설치해야 Native AOT를 사용할 수 있습니다.

2개의 좋아요

.NET 7의 성능 향상 - .NET 블로그 (microsoft.com)

이 글을 참고하여 관련 옵션을 부여하면 2Mb의 의존성 없는 실행파일도 맞이할 수 있습니다.

image

1개의 좋아요

제가 잘못알고 있었군요.

Attribute 자체는 메타데이터 기능이므로 정적인 기능이었네요.
제가 Attribute를 쓸 때 항상 내부의 기능에 엑세스할 때 리플렉션을 사용했기 때문에 그렇게 밖에 안써본 경험이라 착각했나봅니다.

image

흠…그런데 어차피 안에 있는 기능에 연결하려면 리플렉션을 쓸 수 밖에 없는 것으로 저도 알고 사용해왔는데, 뭔가 Native AOT에서는 Attribute를 정의하고 쓰는 게 사실상 제 선에서는 어려울 거 같네요…; 반쪽짜리 Attribute로 좀 다가옵니다.


image

보니까 모든 리플렉션은 아니고 코드 주입성 리플렉션만 안되나보군요

6개의 좋아요

Avalonia가 초기부터 Native AOT의 전신인 CoreRT 때부터 착실히 지원해 온 터라 기대를 하고 컴파일 해봤는데, 안되는군요;

image

XAML을 미리 컴파일 했느냐 안했느냐의 사소한 문제일 듯 싶은데 아마도 버전 11 정식 릴리스 때는 되지 않을 까 합니다.

참고로 CoreRT에서의 Avalonia 데모는 AvaloniaCoreRTDemo를 통해 확인하실 수 있습니다.

2개의 좋아요

용량에 대한 아쉬움도 있네요. 기본 템플릿으로 만들어진 실행 파일이라 대략 5~8Mb 정도면 봐줄 만한데요. 이것도 완전한 트림모드(copyused가 아닌 link)를 지원하게 되면 대폭 축소될 것이라고 생각합니다.

1개의 좋아요

오…? Native AOT의 전신이 CoreRT 였었나요…? 이건 몰랐네요…ㅋㅋ 베어너클4 생각도 나고 좋네요…

1개의 좋아요

두분 좋은 내용 감사합니다 ^^

1개의 좋아요