net core とマルチプラットフォーム

30
.NET Core 1.0 と ととととととととととと Deep Dive とと とと

Upload: shozon

Post on 16-Apr-2017

1.744 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: NET Core とマルチプラットフォーム

.NET Core 1.0 とマルチプラットフォームDeep Dive

荒井 省三

Page 2: NET Core とマルチプラットフォーム

アジェンダ• project.json• Microsoft.NETCoreApp• NETStandard Libaray• .NET Core と BCL• 新しい PCL とは

Page 3: NET Core とマルチプラットフォーム

.NET Core とは .NET Framework .NET Core XAMARIN

アプリ

モデル

ベース

ライブラ

リ ベース クラス ライブラリ (BCL) コア ライブラリ

(CoreFx)Mono クラス ライブラリ

ASP.NET

Win FormsWPF UWP

ASP.NET Core

iOSAndroid

コンパイラ 言語 ランタイム共通言語基盤 (Common Language Infrastructure)

OS X

Page 4: NET Core とマルチプラットフォーム

.NET Core とは .NET Framework .NET Core XAMARIN

アプリ

モデル

ベース

ライブラ

ベース クラス ライブラリ (BCL) コア ライブラリ

(CoreFx)Mono クラス ライブラリ

ASP.NET

Win FormsWPF UWP

ASP.NET Core

iOSAndroid

コンパイラ 言語 ランタイム共通言語基盤 (Common Language Infrastructure)

OS X

.NET Standard libraryベース ライブラリの統一化によるマルチ プラットフォーム対応

Page 5: NET Core とマルチプラットフォーム

コンソール アプリ

Page 6: NET Core とマルチプラットフォーム

Project.json{ "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true },

"dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } }}

Page 7: NET Core とマルチプラットフォーム

Project.json• platform

• Microsoft.NETCore.App

• frameworks• netcoreapp1.0

"imports": "dnxcore50"

Page 8: NET Core とマルチプラットフォーム

Microsoft.NETCore.App• .NET Core の依存関係のみを定義したメタ データ パッケージ

"Libuv""Microsoft.CodeAnalysis.CSharp " exclude="Compile""Microsoft.CodeAnalysis.VisualBasic " exclude="Compile""Microsoft.CSharp" version="4.0.1""Microsoft.NETCore.DotNetHostPolicy" version="1.0.1""Microsoft.NETCore.Runtime.CoreCLR" version="1.0.2""Microsoft.VisualBasic" version="10.0.1""NETStandard.Library" version="1.6.0""System.Buffers" version="4.0.0""System.Collections.Immutable" version="1.2.0""System.ComponentModel" version="4.0.1""System.ComponentModel.Annotations" version="4.1.0""System.Diagnostics.DiagnosticSource" version="4.0.0""System.Diagnostics.Process" version="4.1.0""System.Dynamic.Runtime" version="4.0.11""System.Globalization.Extensions" version="4.0.1""System.IO.FileSystem.Watcher" version="4.0.0""System.IO.MemoryMappedFiles" version="4.0.0""System.IO.UnmanagedMemoryStream" version="4.0.1""System.Linq.Expressions" version="4.1.0"

"System.Linq.Parallel" version="4.0.1""System.Linq.Queryable" version="4.0.1""System.Net.NameResolution" version="4.0.0""System.Net.Requests" version="4.0.11""System.Net.Security" version="4.0.0""System.Net.WebHeaderCollection" version="4.0.1""System.Numerics.Vectors" version="4.1.1""System.Reflection.DispatchProxy" version="4.0.1""System.Reflection.Metadata" version="1.3.0""System.Reflection.TypeExtensions" version="4.1.0""System.Resources.Reader" version="4.0.0""System.Runtime.Loader" version="4.0.0 " exclude="Compile" "System.Security.Cryptography.Algorithms" version="4.2.0""System.Security.Cryptography.Encoding" version="4.0.0" "System.Security.Cryptography.Primitives" version="4.0.0""System.Security.Cryptography.X509Certificates" version="4.1.0""System.Threading.Tasks.Dataflow" version="4.6.0""System.Threading.Tasks.Extensions" version="4.0.0""System.Threading.Tasks.Parallel" version="4.0.1" "System.Threading.Thread" version="4.0.0""System.Threading.ThreadPool" version="4.0.10"

Page 9: NET Core とマルチプラットフォーム

Microsoft.NETCore.Runtime.CoreCLR• 依存関係のみを定義したメタ データ パッケージ

"Microsoft.NETCore.Jit" version="1.0.2" "Microsoft.NETCore.Windows.ApiSets" version="1.0.1"

Page 10: NET Core とマルチプラットフォーム

Microsoft.NETCore.Jit• プラットフォームごとのランタイム パッケージへの定義のみ

runtime.json ( コンパイル ターゲットによって切り替える ){ "runtimes": { "win7-x64": { "Microsoft.NETCore.Jit": { "runtime.win7-x64.Microsoft.NETCore.Jit": "1.0.2" } }, "win7-x86": { "Microsoft.NETCore.Jit": { "runtime.win7-x86.Microsoft.NETCore.Jit": "1.0.2" } }, "debian.8-x64": { "Microsoft.NETCore.Jit": { "runtime.debian.8-x64.Microsoft.NETCore.Jit": "1.0.2" } },

Page 11: NET Core とマルチプラットフォーム

Microsoft.NETCore.Windows.ApiSets• プラットフォームごとのランタイム パッケージへの定義のみ

runtime.json ( コンパイル ターゲットによって切り替える ){ "runtimes": { "win10": { "Microsoft.NETCore.Windows.ApiSets": {} }, "win7-x64": { "Microsoft.NETCore.Windows.ApiSets": { "runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets": "1.0.1" } }, "win7-x86": { "Microsoft.NETCore.Windows.ApiSets": { "runtime.win7-x86.Microsoft.NETCore.Windows.ApiSets": "1.0.1" } },

Page 12: NET Core とマルチプラットフォーム

NETStandard.Library 1/3• .NET Core の BCL に相当するメタ データ パッケージ

• この場合は、 dnxcore50 なので Universal Windows Platform となり、 NET Standard 1.3

"Microsoft.NETCore.Platforms" version="1.0.1" ランタイム ターゲットによる切り替え情報"Microsoft.Win32.Primitives" version="4.0.1" "System.AppContext" version="4.1.0" "System.Collections" version="4.0.11" "System.Collections.Concurrent" version="4.0.12" "System.Console" version="4.0.0" "System.Diagnostics.Debug" version="4.0.11" "System.Diagnostics.Tools" version="4.0.1" "System.Diagnostics.Tracing" version="4.1.0" "System.Globalization" version="4.0.11" "System.Globalization.Calendars" version="4.0.1" "System.IO" version="4.1.0" "System.IO.Compression" version="4.1.0" "System.IO.Compression.ZipFile" version="4.0.1"

Page 13: NET Core とマルチプラットフォーム

NETStandard.Library 2/3"System.IO.FileSystem" version="4.0.1" "System.IO.FileSystem.Primitives" version="4.0.1" "System.Linq" version="4.1.0" "System.Linq.Expressions" version="4.1.0" "System.Net.Http" version="4.1.0" "System.Net.Primitives" version="4.0.11" "System.Net.Sockets" version="4.1.0" "System.ObjectModel" version="4.0.12" "System.Reflection" version="4.1.0" "System.Reflection.Extensions" version="4.0.1" "System.Reflection.Primitives" version="4.0.1" "System.Resources.ResourceManager" version="4.0.1" "System.Runtime" version="4.1.0" "System.Runtime.Extensions" version="4.1.0" "System.Runtime.Handles" version="4.0.1" "System.Runtime.InteropServices" version="4.1.0" "System.Runtime.InteropServices.RuntimeInformation" version="4.0.0" "System.Runtime.Numerics" version="4.0.1"

Page 14: NET Core とマルチプラットフォーム

NETStandard.Library 3/3"System.Security.Cryptography.Algorithms" version="4.2.0" "System.Security.Cryptography.Encoding" version="4.0.0" "System.Security.Cryptography.Primitives" version="4.0.0" "System.Security.Cryptography.X509Certificates" version="4.1.0" "System.Text.Encoding" version="4.0.11" "System.Text.Encoding.Extensions" version="4.0.11" "System.Text.RegularExpressions" version="4.1.0" "System.Threading" version="4.0.11" "System.Threading.Tasks" version="4.0.11" "System.Threading.Timer" version="4.0.1" "System.Xml.ReaderWriter" version="4.0.11" "System.Xml.XDocument" version="4.0.11"

Page 15: NET Core とマルチプラットフォーム

Microsoft.NETCore.Runtime.CoreCLR• プラットフォームごとのランタイム パッケージへの定義のみ

runtime.json ( コンパイル ターゲットによって切り替える ){ "runtimes": { "win8-arm": { "Microsoft.NETCore.Runtime.CoreCLR": { "runtime.win8-arm.Microsoft.NETCore.Runtime.CoreCLR": "1.0.2-rc3-24212-01" } }, "win7-x64": { "Microsoft.NETCore.Runtime.CoreCLR": { "runtime.win7-x64.Microsoft.NETCore.Runtime.CoreCLR": "1.0.2" } }, "win7-x86": { "Microsoft.NETCore.Runtime.CoreCLR": { "runtime.win7-x86.Microsoft.NETCore.Runtime.CoreCLR": "1.0.2" } },

Page 16: NET Core とマルチプラットフォーム

.NET Core と BCL の関係• さようなら mscorlib.dll• ようこそ System.Runtime.dll

• BCL 全体を管理するメタ データ パッケージ.NET Standard Library

• 依存関係の管理• ターゲット プラットフォームの管理

Page 17: NET Core とマルチプラットフォーム

.NET Standard Library とは何か• 次世代の PCL (Portable Class Library)• .NET Core ランタイム上で動作する BCL を実現させるものメタデータ パッケージ• PCL との類似点

• バイナリ コードを共有できる API 定義• PCL との相違点

• PCL がプラットフォーム間の共通部分に焦点を当てているのに対して、 API セットに焦点を当てている• バージョン管理がシンプルなのに対して、 PCL は複雑 ( 番号管理 )• プラットフォームに依存しない目的に対して、 PCL プロファイルは

Microsoft プラットフォームを目的にしている

Page 18: NET Core とマルチプラットフォーム

PCL プロファイル 151.NET

framework 4.5.1

Windows 8.1Windows Phone 8.1

Page 19: NET Core とマルチプラットフォーム

.NET Standard Libraryプラットフォーム 別名.NET Standard netstandar

d1.0 1.1 1.2 1.3 1.4 1.5 1.6

.NET Core netcoreapp → → → → → → 1.0

.NET Framework net → 4.5 4.5.1

4.6 4.6.1

4.6.2

4.6.3

Mono/Xamarin Platforms → → → → → → *Universal Windows Platform

uap → → → → 10.0

Windows win → 8.0 8.1Windows Phone wpa → → 8.1Windows Phone Silverlight wp 8.0 →

Page 20: NET Core とマルチプラットフォーム

Target Framework バージョンFramework 最新

バージョンTarget Framework Moniker(TFM)

Compact Target Framework Moniker(TFM)

.NET Standard バージョン

メタ データ パッケージ

.NET Standard 1.6 .NETStandard,Version=1.6

netstandard1.6

N/A NETStandardLibrary

.NET CoreApplication

1.0 .NETCoreApp,Version=1.0

netcoreapp1.0 1.5 Microsoft.NETCore.App

.NET Framework

4.6.3 .NETFramework,Version=4.6.3

net463 1.4 N/A

Page 21: NET Core とマルチプラットフォーム

PCL との互換性• .NET Standard Library 1.0 、 1.1 、 1.2 は PCL プロファイルと互換がある

• Microsoft.NETCore.Portable.Compatobility名前 .NET Portable SubsetProfile 7 .NET Framework 4.5, Windows 8 1.1Profile 3.1 Windows 8.1, Windows Phone Silverlight 8.1 1.0Profile 3.2 Windows 8.1, Windows Phone 8.1 1.2Profile 44 .NET Framework 4.5.1, Windows 8.1 1.2Profile 49 .NET Framework 4.5, Windows Phone Silverlight 8 1.0Profile 78 .NET Framework 4.5, Windows 8, Windows Phone Silverlight 8 1.0Profile 84 Windows Phone 8.1, Windows Phone Silverlight 8.1 1.0Profile 111

.NET Framework 4.5, Windows 8, Windows Phone Silverlight 8.1 1.1

Profile 151

.NET Framework 4.5.1, Windows 8.1, Windows Phone 8.1 1.2

Profile 157

Windows 8.1, Windows Phone 8.1, Windows Phone Silverlight 8.1 1.0

Profile 259

.NET Framework 4.5, Windows 8, Windows Phone 8.1, Windows Phone Silverlight 8

1.0

Page 22: NET Core とマルチプラットフォーム

.NET Standard Library とは• マルチ プラットフォームへ対応するための新しい PCL • 従来までの PCL とは異なるアプローチ• nuget バージョン 3.x が必須のアプローチ

Page 23: NET Core とマルチプラットフォーム

型を参照するとは何かusing System;

namespace ConsoleApplication{ public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); var s = Console.ReadLine(); } }}

Page 24: NET Core とマルチプラットフォーム

メタデータ 1/2Token Versio

nFlags PublicKey Name Culture HashValue

23000001

4.1.0.0 0 b03f5f7f11d50a3a

System.Runtime

23000002

4.0.0.0 0 b03f5f7f11d50a3a

System.Console

AssemblyRef(0x23)

Token ResolutionScope Name Namespace01000003

23000001 DebuggableAttribute System.Diagnostics

…01000008

23000001 Object System

01000009

23000002 Console System

TypeRef(0x01)

TypeRef メタデータは、 ResolusionScope によってアセンブリを特定するAssemblyRef メタデータは、アセンブリ識別子を記録している

Page 25: NET Core とマルチプラットフォーム

メタデータ 2/2Token ResolutionScope Name Namespace01000003

23000001 DebuggableAttribute

System.Diagnostics

…01000008

23000001 Object System

01000009

23000002 Console System

TypeRef(0x01)

Token MemberRefParent Name Signature0a000001

01000001 .ctor 0x20010108 ( 引数 1 、 I4 、 void)

…0a000007

01000009 WriteLine

0x0001010e ( 引数1 、 string 、 void)

0a000008

01000009 ReadLine 0x00000e ( 引数無し、 string)

MemberRef(0x0a)

シグネチャは、メソッドの呼び出し規約、パラメータ、戻り値などを符号化した値シグネチャによって、オーバーロードされたメソッドを特定できる

Page 26: NET Core とマルチプラットフォーム

Bait and Switch• 型を参照することをメタデータでは

• アセンブリ参照(アセンブリ識別子)• 型(クラス)名• メソッド名とメソッド シグネチャ

• パッケージ システムを使ったテクニック• コンパイル時は、メタデータのみを解決• 配布時にプラットフォーム固有のアセンブリに置き換える

• メタデータの特徴を活用したテクニック• AssemblyRef, TypeRef, MemberRef

Page 27: NET Core とマルチプラットフォーム

まとめ• .NET Core は パッケージングによってマルチ プラットフォームへ対応• nuget 3.x がパッケージ 管理• .NET Standard Library

• 依存関係を管理するメタ データ パッケージ• パッケージ

• コンパイル時に参照する PCL• 配布時に使用するプラットフォーム依存 PCL

Page 28: NET Core とマルチプラットフォーム

Appendix

Page 29: NET Core とマルチプラットフォーム

メソッド シグネチャ呼び出し規約の論理和 0x20 HASTHIS, 0x00 DEFAULT, 0x10 GENERIC, 0x05 VARARG,0x40 EXPLICITHIS

ジェネリックのパラメータ数 (int32 符号化数字、 2-4 バイト )ジェネリックでなければ省略される

パラメータ数 (int32 符号化数字、 2-4 バイト )

戻り値の型0x01 void, 0x0e string, 0x02 bool, 0x08 i4

パラメータの型 ( パラメータの数だけ繰り返す)

Page 30: NET Core とマルチプラットフォーム

参考資料• ISO/IEC 23271

Common Language Infrastructure (CLI)• X 3016 : 2009 ISO/IEC 23271 : 2006共通言語基盤 (CLI)