IT 이모저모

UWP 응용 프로그램, SQL Server 사용하기 - 2

exien 2018. 3. 28. 18:44

기존 PCL 및 .NET Standard

 여기서, 종래부터 가능한 PCL과 새롭게 등장한 .NET Standard의 차이점을 설명하고 둡시다.

 기존 PCL도 .NET Standard도 .NET Framework API의 일부 (부분 집합)을 정한 규격 (사양) 입니다. 그 부분 집합의 결정 방법에 다음과 같은 차이가 있습니다.

 단적으로 말하면, 구현이 먼저 냐 / 규격이 먼저 냐라는 차이입니다. 
· 기존 가능한 PCL 규격 : 각 플랫폼의 구현 ⇒ 공통 API를 찾아 규격화 
· .NET Standard 규격 : 공통 구현해야 할 API를 규정 ⇒ 이에 따라 각 플랫폼에서 구현

 기존 가능한 PCL은 .NET Standard의 등장함에 따라 " 프로필 기반 PCL」라고 불리게되었습니다. .NET Standard 규격에 따라 만들어진 클래스 라이브러리는 " .NET Standard 기반 PCL "입니다 ( ".NET Standard ~ 휴대용 클래스 라이브러리와 비교 "참조). 모두 만들어진 바이너리 파일은 PCL ( Portable Class Library - 이식 가능한 라이브러리)이다라고하는군요.

프로필 기반 PCL (기존 PCL)

 프로필 기반 PCL은 그 종류가 많은 것과 일정한 포함 관계가 없다는 문제점이 있습니다. 예를 들어 NuGet 문서 "Target frameworks"의 Portable Class Libraries 섹션에는 "Profile2 (portable-net40 + win8 + sl4 + wp7)"에서 출발 40 개 이상의 프로파일이 실려 있습니다. 게다가 프로파일 사이에 포함 관계가 있다고는 할 수 없다니까, 어떤 프로파일을 선택할지 고민하게됩니다.

 프로파일의 포함 관계에 대한 세 (버전 차이를 포함하면 5 개)의 플랫폼에서만 짜서 몇 가지 예를 생각해 보겠습니다 (아래 그림).

  • .NET Framework 4.5 / 4.5.1 : "본가"의 .NET Framework 구현입니다. Windows Forms 및 WPF 등에서 사용하고있는 것. 이후 ".NET4.5 / 4.5.1"로 단축합니다
  • Windows Runtime for Windows 8.0 / 8.1 : Windows 8.0 / 8.1 저장소 응용 프로그램에서 사용할 수있는 .NET Framework 구현입니다. 이후 "WinRT8 / 8.1"로 단축합니다
  • Silverlight for Windows Phone 8.0 : Windows Phone 8.0 용 Silverlight 응용 프로그램에서 사용할 수있는 .NET Framework 구현입니다. 이후 "SL8"로 단축합니다
5 개의 플랫폼의 관계
3 (버전 차이를 포함하면 5 개) 플랫폼에서 생각해 보면
  • Profile78 : .NET4.5와 WinRT8과 SL8 모두에게 공통적으로 존재하는 API 세트입니다 (아래 그림). 여기에서 생각하는 다섯 가지 플랫폼 모두에서 사용할 수있는 PCL되지만 대신 사용할 API의 수는 적습니다.
Profile78은 .NET4.5와 WinRT8과 SL8에 공통 부분
Profile78 (붉게 칠한 부분)
  • Profile49 : .NET4.5와 SL8에 공통적으로 존재하는 API 세트입니다 (아래 그림). WinRT에 존재하는 API도 포함되어 있지만 (얇은 빨간색), WinRT에서 사용할 수없는 API를 포함하고 있기 때문에 (진한 빨강), WinRT에서 사용할 수없는 PCL됩니다. 이 Profile49은 위 Profile78을 포함하고 있습니다.
Profile49은 .NET4.5와 SL8에 공통 부분
Profile49 (붉게 칠한 부분)
  • Profile44 : .NET4.5.1과 WinRT8.1에 공통적으로 존재하는 API 세트입니다 (아래 그림). .NET4.5 / WinRT8.0 / SL8에서 사용할 수없는 PCL됩니다. 이 Profile44는 앞서 Profile78을 포함하고 있습니다 만, 위의 Profile49는 (공통 부분은 있지만) 포함 관계는되어 있지 않습니다.
Profile44는 .NET4.5.1과 WinRT8.1에 공통 부분
Profile44 (붉게 칠한 부분)

.NET Standard 기반 PCL

 .NET Standard 도 .NET Framework의 하위 집합을 정의하는 표준입니다 만, 그 버전에 포함 된 API는 깨끗한 포함 관계가 있습니다 (아래 그림). 본고 집필 시점에서는 최대 버전은 2.0입니다. 또한 .NET Standard 1.x는 실제로는 1.0에서 1.6까지 7 버전 있지만, 여기에서는 일부 생략하고 있습니다. 그림에서 명기 한 숫자는 해당 버전의 .NET Standard에 포함되는 API의 수입니다 ( " .NET Standard FAQ '에 따르면). 예를 들어 .NET Standard 1.1에는 10,239 개의 API가 규정되어 있는데, 그중에는 .NET Standard 1.0 7,949 개도 포함되어 있습니다.

.NET Standard 버전은 깨끗한 포함 관계가있다
.NET Standard 버전의 관계 (일부)와 포함되는 API 수

 "표준 선행"(그렇다고는하지만, 실태로는 1.4까지 모든 플랫폼의 구현이 먼저있었습니다)의 .NET Standard는 "플랫폼 버전 XX에서 .NET Standard 버전 YY를 구현했다" 형태가됩니다 (아래 표). 예를 들어, .NET Framework "본가"는 버전 4.6에서 .NET Standard 1.3 API를 구현하고 4.6.1되어 .NET Standard 2.0을 구현 한 형태입니다. 또한 예를 들어, Windows Phone 용 Silverlight 8.0에서 .NET Standard 1.0을 구현 한 형태가되어 있습니다 만, .NET Standard 1.1 이상을 구현하고있는 Silverlight는 나와 있지 않습니다. 또는 반대로, 예를 들어 .NET Standard 2.0 규격의 클래스 라이브러리를 이용하고 싶다면 .NET "본가"는 4.6.1 이후 UWP은 10.0.16299 이후 Xamarin.iOS은 10.14 이후 그리고 Xamarin.Android 8.0 이상이 필요합니다 (Windows Phone 및 Windows Runtime에서 사용할 수 없음).

 따라서 .NET Standard 버전은 프로파일 기반 PCL보다 훨씬 이해하기 쉽게되었습니다. 또한이 표는 발췌 한 것입니다. 완전한 것은 「.NET Standard "의 .NET 구현의 지원 섹션을 참조하십시오.

.NET Standard 버전과 그것을 구현하는 플랫폼 버전 (일부)
 1.01.11.32.0
(.NET Standard API를 수)(7,949)(10,239)(13,122)(32,638)
.NET Framework "본가" 
(+ .NET Core 2 SDK)
4.54.54.64.6.1
Silverlight for Windows Phone8.0N / AN / AN / A
Windows Runtime for Windows 8.x8.08.0N / AN / A
UWP10.0.1204010.0.1204010.0.1204010.0.16299
Xamarin.iOS10.010.010.010.14
Xamarin.Android7.07.07.08.0
.NET Core1.01.01.02.0

.NET Standard 및 .NET Core

 .NET Standard와 비슷한 단어로 " .NET Core "라는 것이 있습니다 만, 다른 것입니다.

 .NET Standard는 표준이지만, .NET Core 구현입니다. .NET Core는 .NET Framework의 '본가'는 독립적 인 크로스 플랫폼 ( Windows / Mac OS / Linux )의 .NET Framework 구현입니다. 현재 (.NET Core 2.0), Windows Forms 및 WPF 등은 포함되지 않고, Web 응용 프로그램 ( ASP.NET Core )와 UWP 앱 / 콘솔 응용 프로그램을 만드는 데 사용됩니다.

 또한 .NET Standard API와 .NET Core API는 다릅니다. 위 표에 올린 것처럼 .NET Core는 .NET Standard 표준 API를 구현하고 있습니다 만, 그것뿐만 아니라 .NET Core는 .NET Standard없는 API도 구현되어있는 것입니다. 예를 들어, 다음 항목에서 다루는 System.Data.SqlClient 네임 스페이스 는 .NET Core 2.0에 구현되어 있지만 .NET Standard 2.0 에 정의되어 있지 않습니다. 또는 .NET Core 2.0 KeyValuePair <TKey, TValue> 구조체 는 Deconstruct 방법이 있지만 .NET Standard 2.0 KeyValuePair <TKey, TValue> 구조체 는 없습니다.

.NET Core 2.0 KeyValuePair <TKey, TValue> .Deconstruct 메소드

 이것이 있으면, Dictionary <TKey, TValue> 컬렉션을 foreach 루프에서 돌릴 때 튜플 형태로받을 수 있기 때문에 매우 편리합니다 (아래). 이것을 알게되면 일단 KeyValuePair에서받은 후 루프에서 키와 값을 가져 오는 코드를 쓰는 것이 아무래도 낭비 생각되어 어쩔 수 없습니다 (위).

.NET Famework 4.6.1의 경우
// 기존의 작성 밖에 할 수없는
foreach (var kvp in dic)
{
  var id = kvp.Key;
  var name = kvp.Value;
  // id (키)와 name (값)를 사용하여 뭔가
}
.NET Core 2.0의 경우
// .NET Core 2.0 간결하게 쓸
foreach (var (id, name) in dic)
{
  // id (키)와 name (값)를 사용하여 뭔가
}