티스토리 뷰

반응형

.Net Standard의 변경사항이 있습니다. 참고하세요

The future of .NET Standard (tistory.com)


저녁마다 앱 만든다고 뚝딱뚝딱하고 있다가, Web Service에서도 사용해야하는 데이터가 있어서, PCL(Portable Class Library)를 추가하려고 했는데.. 않되더군요..쿨럭 이게 무슨일인가하고 내용을 잘 살펴보니 PCL은 Visual Studio 2013까지만 지원을하고 Visual Studio 2017에서는 .Net Standard를 사용하라고 나와있더군요..그래서, 공부도 할겸 포스팅을 하기로 했습니다.



1. .Net Standard가 뭔가요?


과거에 우리는 이렇게 복잡한 세상에서 개발을 진행 했습니다. 닷넷 프레임웍 따로, 닷넷 코어 따로, 자마린 따로..

클래스 라이브러리도 각각 만들어서 사용하고 있었죠..




이런 복잡한 구조를 개선하기 위해 닷넷 스텐다드가 추가되었습니다!


1) 닷넷 스탠다드는 코드를 공유하기 편리합니다.


과거 PCL을 이용해서 코드를 공유하던 것을 쉽게 대체할 수 있습니다.


2) 더 많은 API를 사용할 수 있습니다.


1.6에서 1.3k의 정도의 API를 사용할 수 있었지만, 2.0은 32k의 API 사용이 가능합니다.


3) 닷넷 프레임웍과 호환성이 좋습니다.


대부분의 NuGet package들이 닷넷 프레임웍을 대상으로 만들어져 있습니다. 그래서, 호환성을 높여서 닷넷 스텐다드 2.0을 이용할 경우 NuGet package의 70% 정도를 그대로 사용할 수 있습니다. 




위에서도 보았듯이 지원하는 플랫폼이 상당히 많습니다. 1.0이 나온것이 2016년이였는데(1.0 출시 안내).. 어느덧 2.0이..그동안 PCL만 사용했었는데..이제는 이 녀석을 이용해서 개발을 해야 할 것 같습니다.


.NET 표준 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0
.NET Core 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0
.NET Framework(.NET Core 1.x SDK 포함) 4.5 4.5 4.5.1 4.6 4.6.1 4.6.2
.NET Framework(.NET Core 2.0 SDK 포함) 4.5 4.5 4.5.1 4.6 4.6.1 4.6.1 4.6.1 4.6.1
Mono 4.6 4.6 4.6 4.6 4.6 4.6 4.6 5.4
Xamarin.iOS 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.14
Xamarin.Mac 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.8
Xamarin.Android 7.0 7.0 7.0 7.0 7.0 7.0 7.0 8.0

Universal Windows Platform (UWP)

10.0 10.0 10.0 10.0 10.0 16299 16299 16299
8.0 8.0 8.1
Windows Phone 8.1 8.1 8.1
Windows Phone Silverlight 8.0


UWP 지원에 대한 부분은 여기를 참고하세요. 

대충 아시겠죠? 이제 직접 사용해 보도록 하겠습니다.


닷넷 스탠다드 2.0에서 사용가능한 API 조회는 여기서~



2. .NET Standard 클래스 라이브러리 만들기


Windows Template Studio를 이용해서 Blank, Basic MVVM pattern 프로젝트를 생성합니다.


혹시 Windows Template Studio를 모르시는 분은 여기를 클릭하세요


이제 .Net Standard 프로젝트를 여기에 추가해줍니다.


솔루션에서 마우스 오른쪽 Add -> New Project...



.NET Standard선택 -> Class Libaray (.NET Standard) 선택 -> 이름 입력 후 OK



추가된 프로젝트 속성을 확인해보면 .NET Standard 2.0이라고 표시된 것을 확인할 수 있습니다.




3. UWP앱이랑 연결을 시키기..


UWP앱에서 마우스 오른쪽 -> Add -> Reference...선택



Projects -> NetStandard.Standard 프로젝트를 체크 하고 OK를 누르면 완료 입니다.



빌드를 해보도록 하죠.


이런..빌드를 했더니, 오류가 쫘르륵!! 위의 표에서 보면 이유를 알 수 있습니다. .NET Standard 2.0은 Windows 10 Fall Creators Update 버전만 지원합니다. 그래서, UWP 앱의 최소 지원 버전을 변경해 주어야 합니다.



UWP앱의 속성에 들어갓가서 아래와 같이 최소 버전을 Fall Creators Update로 변경해 주시고 다시 빌드를 하시면 완료됩니다.




4. DataSet 사용이 가능??


닷넷의 오래된 기능으로 메모리에 데이터를 저장하는 DataSet을 사용할 수 있었습니다. 그런데, 그동안 UWP에서는 지원이 앙되던 녀석이 였는데, .NET Standard 2.0에서 부활 했습니다.~


아래와 같이 TestClass를 만들어 보도록 하겠습니다.

* 아래 코드는 여기서 복사했습니다.


using System.Data;

namespace NetStandard.Standard.Helpers
{
    public static class TestClass
    {
        public static DataSet GetXmlFromDataSet()
        {
            // Create two DataTable instances.
            var table1 = new DataTable("patients");
            table1.Columns.Add("name");
            table1.Columns.Add("id");
            table1.Rows.Add("sam", 1);
            table1.Rows.Add("mark", 2);

            var table2 = new DataTable("medications");
            table2.Columns.Add("id");
            table2.Columns.Add("medication");
            table2.Rows.Add(1, "atenolol");
            table2.Rows.Add(2, "amoxicillin");

            // Create a DataSet and put both tables in it.
            var set = new DataSet("office");
            set.Tables.Add(table1);
            set.Tables.Add(table2);
           
            // Visualize DataSet.
            return set;
        }
    }
}




이 녀석을 UWP의 ViewModel에서 호출해서 사용해 보겠습니다.


리샤퍼를 사용하시는 경우에는 업데이트를 해야 인텔리 센스가 정상 동작하는 것 같습니다. 참고해주세요~

JetBrains ReSharper Ultimate 2017.2.2  Build 109.0.20171006.122324
ReSharper 2017.2.20171006.123800


using Windows.UI.Xaml.Navigation;
using NetStandardSample.Helpers;
using NetStandardSample.Services;
using NetStandard.Standard.Helpers;


namespace NetStandardSample.ViewModels
{
    public class MainViewModel : Observable
    {
        private string _xmlText;

        public MainViewModel()
        {
            NavigationService.Navigated += NavigationService_Navigated;
        }

        public string XmlText
        {
            get => _xmlText;
            set => Set(ref _xmlText, value);
        }

        private void NavigationService_Navigated(object sender, NavigationEventArgs e)
        {
            var set = TestClass.GetXmlFromDataSet();
            if (set == null) return;
            XmlText = set.GetXml();

        }
    }
}


MainPage.xaml


MainPage.xaml.cs에 


//public MainViewModel ViewModel { get; } = new MainViewModel(); 문장은 주석 처리했습니다.


<Page
    x:Class="NetStandardSample.Views.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:viewModels="using:NetStandardSample.ViewModels"
    Style="{StaticResource PageStyle}"
    mc:Ignorable="d">
    <Page.DataContext>
        <viewModels:MainViewModel />
    </Page.DataContext>

    <Grid
        x:Name="ContentArea"
        Margin="{StaticResource MediumLeftRightMargin}">

        <Grid.RowDefinitions>
            <RowDefinition x:Name="TitleRow" Height="48" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <TextBlock
            x:Name="TitlePage"
            x:Uid="Main_Title"
            Style="{StaticResource PageTitleStyle}" />

        <Grid
            Grid.Row="1"
            Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
            <TextBox Text="{Binding XmlText, Mode=TwoWay}" AcceptsReturn="True" />
        </Grid>
    </Grid>
</Page>


실행 결과는 아래와 같습니다. 정상적으로 DataSet을 반환 받아서, 메소드까지 실행해서 xml형태로 화면에 출력했습니다.


그렇다면.. 다른 프로젝트에서도 동일하게 동작할까용?



콘솔 프로젝트를 추가하고 사용해 보았습니다. 결과는 대만족입니다.




5. 소스


NetStandard.Sample.zip



PS. 그런데..Fall Creators Update UWP에서는 property marker가 제대로 동작하지 않는 버그가 있습니다. 신고는 했구용 다음번 업데이트 때 개선될 것으로 예상합니다. 흐흐


반응형
댓글