.NET 표준 및 .NET Core


240

.NET Standard와 .NET Core의 차이점에 대해 읽었지만 차이점이 무엇인지, 언제 .NET Standard 라이브러리 프로젝트를 선택하고 언제 .NET Core 라이브러리 프로젝트를 선택해야하는지 모르겠습니다.

.NET 표준은 사용 된 플랫폼에 관계없이 (선택한 .NET 표준 버전과 플랫폼이 호환되는 한) API 세트를 항상 사용할 수 있도록하는 것입니다. 내가 실수하지 않으면 .NET Standard의 클래스 라이브러리를 만든 다음 선택한 .NET Standard 버전과 호환되는 모든 플랫폼에서 사용할 수 있습니다.

.NET Core를 사용하면 플랫폼 간 사용을위한 것이므로 .NET Core 라이브러리를 선택하면 .NET Standard와 마찬가지로 많은 플랫폼에서도 사용할 수있는 것 같습니다.

결국에는 차이점이 없습니다. 언제 사용해야합니까? 그들 사이의 차이점은 무엇입니까?


33
코드 용어로 : .net 표준 = 인터페이스, .net 코어 = 클래스; 클래스에 대해 코드를 작성하면 더 많은 메소드 (etc)를 얻지 만 구체적인 유형 (및 자손)으로 제한됩니다. 당신이 인터페이스를 사용하는 경우가 있습니다 작은 표면을 얻을 수 있지만, 한 그 구현이 예상되는 것을 : 네, .NET의 핵심 목표를 여러 플랫폼을로 ... 임의의 구현에 대해 작동하지만 거기에 다른 .NET의 구현 표준
Marc Gravell

9
.NETStandard는 PCL을 대체합니다. 휴대용 클래스 라이브러리를 사용하면 둘 이상의 플랫폼 (전화, 데스크탑, 상점, 브라우저, xbox 등)에서 실행할 수있는 라이브러리를 작성할 수있었습니다. 그것은 n으로 심하게 고통 받고, 잘 확장되지 않았습니다! 문제 때문에 포기했습니다. .NETCore는 첫 번째 프레임 워크 일 뿐이며 나머지는 따라야하는 것이 가장 쉬웠습니다. 이는 .NETStandard v2.0에서 진행중인 작업 중 매우 큰 변화라는 점을 명심하십시오. 그들 모두를 지배하는 표준, 지금 :)
Hans Passant

기존 질문에 추가 질문을 추가하지 마십시오. 편집의 질문은 이것과 별개입니다.
Jon Skeet

1
@JonSkeet 그렇다면 새로운 질문을 열어야합니까? 조언을 주셔서 감사합니다. 처음에는 .net Core 멀티 대상에 대한 새로운 질문을 열었고 중복 질문이라고 말했기 때문에 다운 투표되었습니다.
Álvaro García

@ ÁlvaroGarcía : 그렇습니다. 그러나 분명하게하십시오. 현재 한 문장으로 된 질문은 전혀 명확하지 않습니다.
Jon Skeet

답변:


195

나는 당신의 의심을 더 명확히하고 Jon Skeet의 답변을 확장하려고 노력할 것입니다.

.NET Standard는 사양 이므로 특정 .NET Standard 버전 용으로 컴파일 된 라이브러리를 다른 .NET Standard 구현에서 사용할 수 있습니다.

으로 내 다른 코멘트에서 말했다, .NET 표준 및 기타 .NET 표준 구현 (.NET 코어, .NET 프레임 워크, 등) 사이의 관계에 대한 좋은 비유입니다 데이비드 파울러하여이 요점은 : .NET 표준 버전은 Interfaces프레임 워크가있는 동안, 이러한 인터페이스의 구현.

이 단순화 된 다이어그램은이 관계를 이해하는 데 도움이 될 수 있습니다.

NET 표준 인터페이스 유추

타겟팅하는 모든 NetCore10것은 INetStandard15API NetCore10 특정 API (예 :) 에 액세스 할 수 DotNetHostPolicy있습니다.

물론이 라이브러리는 다른 INetStandard15구현 에서는 사용할 수 없습니다 ( 또는 NetCore10로 변환 할 수 없음 ).NetFramework462Mono46

당신은, 대신, 필요 단지에 액세스 할 경우 INetStandard15API를 라이브러리에 의해 사용될 수있다 (및 대상 대신 구체적인 프레임 워크의 사양이 있음) 어떤 어떤 구현을 프레임 워크 ( NetCore10, NetFramework462, 등)

참고 : 원래 비유에서 David Fowler는 .NET 표준 버전과 프레임 워크 구현에 모두 인터페이스를 사용했습니다. 인터페이스와 클래스를 사용하는 것이 사양과 구체적인 구현 간의 관계를보다 직관적이고 더 잘 표현한다고 생각합니다.


2
정말 감사합니다. 그러나 나는 의심 스럽다. .net 표준이 인터페이스이고 예를 들어 .net 프레임 워크 및 .net Core로 구현 될 수있는 경우 .net 표준 클래스 라이브러리를 작성하고이 프로젝트를 다른 프로젝트에서 사용할 때 net 프레임 워크 또는 .net을 사용하는 구현 핵심?
Álvaro García

8
컴파일 된 응용 프로그램의 구현을 사용합니다 (무엇이든). NET 코어 앱을 컴파일하면 NET 코어 라이브러리 (NET 표준 구현)를 사용합니다.
Federico Dipuma

5
이 다이어그램은 핵심 / 표준 / 프레임 워크 관계를 설명하는 데 큰 도움이됩니다.
재스퍼

따라서 net461 콘솔 응용 프로그램을 만들고 netstandard2.0 라이브러리를 대상으로 지정하면 해당 표준 lib의 어떤 것도 콘솔 응용 프로그램에서 확인되지 않습니다. 그래서 ... ??
Sinaesthetic

2
그림은 천 단어의 가치가있다
Nikaas

182

.NET Core는 .NET Standard 의 구현 입니다. 여러 운영 체제에서 사용할 수 있지만 동일하지는 않습니다. 다른 .NET 표준 구현도 있습니다.

당신이 .NET 핵심 라이브러리를 작성하는 경우 그래서, 그것은 .NET 코어에서 구현되는 것들에 액세스 할 수 있지만 것 없는 .NET 표준의 일부가 라이브러리와 호환되지 않습니다 다른 .NET 표준의 구현, Xamarin, Tizen, 전체 .NET 데스크톱 프레임 워크 등

한마디로 : 최대 이식성을 달성하려면 라이브러리를 .NET 표준으로 지정하십시오.


5
@ ÁlvaroGarcía : "it"이 무슨 뜻인가요? .NET Core 1.0? 반드시 그런 것은 아닙니다. .NET Core 1.0에는 여전히 추가 항목이 포함될 수 있기 때문 입니다. 이 항목은 .NET Standard 1.6을 대상으로하는 경우 Mono 4.6 .NET Core 1.0 모두에서 코드를 실행할 수 있음을 의미합니다 .
Jon Skeet

4
.NET Core (CoreCLR & CoreFX) 이외의 다른 .NET Core 어셈블리는 실행할 수 없습니다. 관련 표준 (1.3, 1.6, 2.0 등)에 대한 계약 상 의무를 충족하는 모든 프레임 워크에서 .NET 표준 어셈블리를 실행할 수 있습니다.
마크 렌들

2
크로스 플랫폼은 프레임 워크가 아닌 운영 체제를 나타냅니다.
마크 렌들

15
유추하여 .NET 표준을 인터페이스 (예 :)라고 상상해보십시오 INetStandard16. .NET Core 1.0 및 Mono 4.6은 모두 구현 INetStandard16합니다. .Net Core 1.0을 Mono 4.6으로 (또는 그 반대로) 변환 할 수는 없지만 사용하는 모든 것이 INetStandard16두 가지 모두에서 작동합니다. ( David Fowler의 신용 )
Federico Dipuma

6
이것은 나를 놀라게했다. 이름이 거꾸로 보입니다. 당신은 "코어"라는
것이이

6

.NET Core 클래스 라이브러리는 기본적으로 .NET Framework 라이브러리의 하위 집합이며 API가 더 적습니다. .NET Core Class 라이브러리를 고수하면 런타임간에 코드를 공유하기가 어렵습니다. 이 코드는 필요한 API가 없기 때문에 다른 런타임 (Mona for Xamarin)에서는 작동하지 않을 수 있습니다. 이 문제를 해결하기 위해 사용할 수있는 API를 알려주는 사양 세트 인 .NET 표준이 있습니다 . .NET Standard의 주요 목적은 런타임간에 코드를 공유하는 것입니다. 또한이 사양은 모든 런타임에 의해 구현되어야합니다. ( Xamarin 용 .NET Framework, .NET Core 및 Mono).

따라서 .NET Core 프로젝트에만 라이브러리를 사용한다고 확신하는 경우 .NET Standard를 무시할 수 있지만 .NET Framework 또는 Mono for Xamarin에서 코드를 사용할 가능성이 적다면 더 좋습니다. .NET 표준에 충실

또한 높은 버전의 .NET Standard에는 더 많은 API가 포함되어 있지만 더 많은 플랫폼에서 더 낮은 버전이 지원됩니다. 따라서 런타임간에 공유하려는 .NET 표준 라이브러리를 작성하면 가능한 가장 낮은 버전을 대상으로하여 가장 많은 플랫폼에 도달 할 수 있습니다. 예를 들어 .NET Framework 4.5 및 .NET Core 1.0에서 실행하려는 경우 사용할 수있는 가장 높은 .NET 표준 버전은 .NET Standard 1.1입니다. 이에 대한 자세한 내용 은 설명서에서이 훌륭한 표를 참조하십시오 .

추신 : 또한 라이브러리를 .NET 표준으로 변환하려는 경우 .NET 이식성 분석기가 도움이 될 수 있습니다.


4

.NET Standard 는 .NET 구현에서 사용할 수있는 .NET API의 사양입니다. 이를 통해 모든 .NET 구현에 대해 균일 한 BCL API 세트를 정의 할 수 있습니다.

.NET Core 는 이러한 .NET 표준 구현 중 하나입니다. .NET Framework는 .NET Standard의 또 다른 구현입니다.

.NET 블로그의 이미지

여기에 이미지 설명을 입력하십시오

Federicos answer 는 각 프레임 워크가 버전과 함께 어떻게 진화하는지에 대한 그래픽 개요를 제공합니다. 아래의 Microsoft Docs 다이어그램 살펴보십시오 .

여기에 이미지 설명을 입력하십시오

타겟팅 .NET 표준은 이러한 .NET 코어 (또는 .NET 프레임 워크)와 같은 특정 .NET 플랫폼을 대상으로하는 반면 플랫폼 지원은 해당 플랫폼에 대한 모든 플랫폼 기능을 사용할 수를 증가시킨다.


2

.NET Standard 는 모든 .NET 구현이 제공해야하는 API 사양입니다. .NET 제품군에 일관성을 제공하며 모든 .NET 구현에서 사용할 수있는 라이브러리를 구축 할 수 있습니다. 공유 구성 요소 빌드를위한 PCL을 대체합니다.

.NET Core 는 ASP.NET Core를 사용하여 콘솔 응용 프로그램, 웹 응용 프로그램 및 클라우드 서비스를 구축하는 데 최적화 된 .NET 표준의 구현입니다. SDK에는 Visual Studio 개발 외에도 전체 명령 줄 기반 개발 워크 플로를 지원하는 강력한 도구가 포함되어 있습니다. aka.ms/netstandardfaqaka.ms/netcore 에서 자세한 내용을 확인할 수 있습니다 .


위의 질문에 언급 된 대부분의 내용에 대한 명확한 설명과 함께 Microsoft (MSDN-2017 년 9 월)의 매우 유용한 다음 기사에서 찾을 수 있습니다. .NET 표준-.NET Core 및 .NET 표준


0

.NET Framework을 의미 했습니까? .NET 표준은 .NET Framework, .NET Core 및 Xamarin과 같은 구현이므로

Linux에서 호스팅 할 수 있기 때문에 .NET Core를 좋아합니다 (제 경험에 nginx 사용). IIS에서만 호스팅 할 수있는 .NET 프레임 워크와 다릅니다. 이 경우 호스팅 예산을 고려할 수 있습니다 (Windows 서버가 비싸기 때문에).

에서 개발 환경 관점 , 닷넷 코어는 경량입니다. 따라서 Visual Studio뿐만 아니라 IDE에도 VSCode, Sublime을 사용할 수 있습니다.


0

간단히 말해서 .NET 표준은 dll로 컴파일되는 클래스 라이브러리 프로젝트를 작성하는 데 사용됩니다. .NET Core는 모든 운영 체제 (Windows, Linux, MacOS)에서 실행할 수있는 실제 웹 응용 프로그램 개발에 사용할 수 있습니다. .NET Core 3에서 Microsoft는 WPF를 사용하여 데스크톱 앱을 개발할 수있는 기능을 제공했지만 지금까지 이러한 앱은 플랫폼 간이 아니며 Windows 시스템에서만 실행됩니다. 향후 Microsoft는 플랫폼 간 플랫폼도 만들 수 있습니다. 라이브러리 / dll은 .NET (.NET 프레임 워크, .NET 코어)을 사용하는 모든 응용 프로그램에서 사용할 수 있습니다. 즉, .NET 표준을 .NET 프레임 워크 및 .NET 코어와 함께 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.