닷넷 버전이 낮아도 프로그램이 실행되는 이유는?

안녕하세요. :smile:

예를들어 닷넷 프레임워크 4.8 버전으로 개발되었지만
4.8 이하의 클라이언트 환경에서도 실행이 되는 이유는 무엇인가요?

실행은 되지만 클라이언트 닷넷 버전 상위 기능이 호출 되는 순간 프로그램이 종료되는 것 같은데요.
닷넷프레임워크에서 의도했거나 무언가 숨은 히스토리가 있는지도 궁금합니다!

일단 최소한의 실행을 통해 업데이트 할 수 있는 여지를 두려는 의도인지도 궁금하고요.

실행되는 것이 당연한거라면 왜 당연한지 구조적인 부분에 대해서도 알고 싶습니다!

감사합니다. !!

좋아요 1

닷넷 프레임워크는 내부적으로 공용 언어 런타임이라는 부분과, 여기에 덧붙여 우리가 아는 기능을 제공하는 클래스 라이브러리 부분으로 나뉩니다. (혹시 설명이나 용어 선택이 잘못되었다면 피드백 주시면 감사하겠습니다.)

Common Language Runtime - Wikipedia

그래서 공용 언어 런타임을 기준으로 보면, 닷넷 프레임워크는 1.0, 1.1, 2.0, 4.0이 존재합니다. 2.0 ~ 3.5 사이는 CLR 런타임 기준으로 2.0의 런타임을 쓴다고 말하고, 4.0 ~ 4.8 사이는 CLR 런타임 기준으로 4.0의 런타임을 쓴다고 말합니다.

그래서 공용 언어 런타임이 일치하는 한 기본적으로 실행에는 문제가 없으나, 말씀하신대로 4.8 프로필에서만 쓸 수 있는 어셈블리가 빠지거나 차이가 나는 상태로 배포된 애플리케이션이 4.5 환경에서는 특정 부분에서 Assembly 관련 Exception이 발생하거나 특정 메서드를 찾을 수 없다는 Exception이 나면서 종료될 수 있습니다.

참고로 이런 문제는 .NET Framework용 ASP.NET 애플리케이션을 리눅스로 포팅하기 위해서 Mono로 가져갈 때도 흔히 발생하는 문제였지만, 요즈음은 그 갭이 많이 줄어든 편입니다. .NET Source Code Integration | Mono (mono-project.com) 에 자세한 설명이 나와있습니다. 더 나아가서 .NET 5나 6를 타겟으로 맞춘다면 그마저도 고민할 필요가 없고요.

덧. 이 체계에서 벗어나는 런타임으로는 또 한편으로 .NET Micro Framework, Silverlight, Mono, Moonlight, DotGNU 등등 여러 런타임들이 있었습니다.

좋아요 6

그리고 현재의 닷넷 코어는 윈도우 기반으로 만들어져있던 닷넷 프레임워크를 탈피하기 위한 니즈 + OWIN이라는 이름의 정말 가벼운 웹 API를 위한 실험의 성공 + 파편화된 여러 런타임들의 일관성 보장을 한 번에 달성하기 위해 출발한 프로젝트이고, 사실 처음에는 .NET Framework 5.0이라는 이름으로 기획되었습니다.

그런데 멀리 돌고 돌아서 .NET Core라는 이름으로 다시 시작해서, 정말로 닷넷 프레임워크와 통합을 이룰만큼 성숙해졌다고 판단하여 지난 해 닷넷 5로 리브랜딩할 수 있었죠. ㅎㅎ

좋아요 4

@rkttu 앗 좋은 설명 감사드립니다.!! :smile:

좋아요 2

@rkttu 역사공부까지~ (메모…)

좋아요 2

참고로, 4.8로 개발하고 이하의 클라이언트 환경을 기대하는 것은 오류가 발생할 가능성이 있기 때문에 일반적으로는 해당 응용 프로그램이 돌아갈 최소 버전을 맞추고 app.config에 설정을 추가하는 식으로 개발하는 것이 좋습니다.

가령, .NET Framework의 경우에는 supportedRuntime을 사용하거나,

.NET Framework: 302. supportedRuntime 옵션과 System.BadImageFormatException 예외 (sysnet.pe.kr)

.NET Core는 rollForward 옵션을 쓰면 됩니다.

.NET Framework: 992. C# - .NET Core 3.0 이상부터 제공하는 runtimeOptions의 rollForward 옵션 (sysnet.pe.kr)

좋아요 4