.NET Core と
マルチ プラットフォーム
荒井 省三
日本マイクロソフト株式会社
アジェンダ
• .NET Core 概要
• CLI ランタイムの仕組み
• 標準化
• マルチプラットフォームでは
• .NET CLI と .NET Framework
• まとめ
.NET Core とは
.NET Framework .NET Core XAMARIN
アプリ
モデル
ベース
ライブラリ
.NET Core とは
.NET Framework .NET Core XAMARIN
アプリ
モデル
ベース
ライブラリ
CLI のプログラムを動かす仕組み
プログラム
実行エンジン
ホスト OS
ライブラリ参照
ロード
アセンブリ (Assembly )
• プログラムの入れ物
• Portable Executable フォーマット
PE ヘッダー
PE 拡張ヘッダー
メタデータ
ヘッダー
メタデータ
CLI で規定された
ファイル フォーマット
標準化
• Common Language Infrastructure
ISO/IEC 2721
ECMA-335
JIS X3016
• Microsoft Open Promise
• Microsoft Reference Source
• .NET Core - MIT License
CLI とは (※)
• 第1章 概念とアーキテクチャ
• 第2章 メタデータ定義及び意味論
• 第3章 CIL 命令集合
• 第4章 プロファイル及びライブラリ
• 第5章 デバッグ情報交換形式
• 第6章 付属書
適用範囲、見本プログラム、CIL アセンブラの実装、
クラス ライブラリの設計ガイドライン、可搬性に関する考察、
厳密でない違反、並列ライブラリ
※JIS X3016 より引用
第 1 章 概念とアーキテクチャ (※)
• 6. 共通言語基盤の概要
型安全との関係、管理下駆動実行との関係
• 7. 共通言語仕様 (CLS)
• 8. 共通型システム (CTS)
• 9. メタデータ
• 10. 共通言語仕様のための名前及び型の規則
※JIS X3016 より引用
6. 共通言語基盤の概要 (※)
• 共通型システム (CTS)
• メタデータ
• 共通言語仕様 (CLS)
• 仮想実行システム (VES)
仮想実行システム(VES)はCTSモデルを実装し強制する。VESは,
CLIのために書かれたプログラムのロード及び実行を行う。
• CLIのこれらの側面は,分散コンポーネント及びアプリケーション
を設計し,開発し,配置し,実行するための統一フレームワークを
形作る。
※JIS X3016 より引用
第 2 章 メタデータ及び意味論 (※)
• 24. メタデータの物理的な配置
PE (Portable Executable) フォーマット
※JIS X3016 より引用
CLI と仮想実行システムの関係
CLI
VES
CTS
CLS
CLI と実装系の関係とは
CLI/VES
CoreCLRCLR
Mono
Runtime
VES の仕組みを考えてみる
アセンブリ メタデータ
ローダー 実行時クラス情報
EEClass
クラス
ローダー
フィールド データ
インスタンス
メソッド テーブル
メソッドA
メソッドB
メソッドC
…
CIL テーブル
実装A
実装B
実装C
…
Native Cache
実装A
実装B
実装C
…
JIT
実行時クラス
インスタンス
VES の特徴
• ターゲットを特定していない仮想実行システム
• アセンブリ (PE フォーマット) をロードする
• 管理下データ (Managed Data) = GC
• 型安全 (Type Safe) = スタック ウォークなど
• アプリケーション ドメインが実行単位
CLRは、アプリ、Shared、System の 3ドメイン
• コードの最適化 = JIT による実行時の最適化
ターゲット プラットフォームごとに異なる JIT 実装が可能
AOT や NGEN は、実行時の最適化ではない
マルチプラットフォームで同じか?
.NET Framework .NET Core XAMARIN
アプリ
モデル
ベース
ライブラリ
同じコードか?
• 仮想実行システム (VES)
• 同じサービスを提供できれば問題ない
• プラットフォームごとに、システム コールなどが違っている
• ライブラリ
• 同じサービスを提供できれば問題ない = API セット
• プラットフォームに依存するものは、異なる実装
• コンパイラ
• 同じサービスを提供できれば問題ない
• コードの最適化はプラットフォームごとに違っているもの
同じコードでないのに配布可能なのは?
• .NET CLI では、publish オプション を使用
• Publish オプションは何かをしている
• Framework や Runtime オプションがある
• 指定しなければ、全てのプラットフォームがターゲット
• Runtime オプションを指定すれば、目的のプラットフォームのみ
.NET Standard とは何か
• CLI のおける FCL(Framework Class Library) に相当?
• .NET Framework における BCL(Base Class Library) に相
当?
• CoreFX とは違うもの
• Mscorlib + に相当
• 実体は何か?
• メタ パッケージ
• NETStandard.Library によって記述されるパッケージは、プラット
フォームのベースに位置するので、特別に扱われます(※)。
※doc.microsoft.com より引用
パッケージ (※)
• メタパッケージ
• NETStandard.Library
• Microsoft.NETCore.App
• フレームワーク
• フレームワーク バージョンは、新しい API が追加されると更新され
ます。
• netcoreapp
• netstandard
• ランタイム識別子 (RID)
• ターゲットのプラットフォームを識別する
※doc.microsoft.com より引用
新規プロジェクト
• dotnet new console –o test
• test フォルダ
• Test.csproj
• Program.cs
test.csproj
• フレームワークが 「netcoreapp1.1」と定義
• Microsoft.NET.Sdk が、.NET Core SDK を意味する
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
</Project>
パッケージのリストア
• dotnet restore
• Obj フォルダ
project.assets.json Nuget パッケージの構成ファイル
test.csproj.nuget.g.props プロジェクト プロパティの構成ファイル
test.csproj.nuget.g.targets Msbuild の targets ファイル
project.assets.json 抜粋 1/4
{
"version": 2,
"targets": {
".NETCoreApp,Version=v1.1": {
"Libuv/1.9.1": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1"
},
"runtimes/fedora-x64/native/libuv.so": {
"assetType": "native",
"rid": "fedora-x64"
},
"runtimes/win7-x64/native/libuv.dll": {
"assetType": "native",
"rid": "win7-x64"
},
}
}
},
project.assets.json 抜粋 続き 2/4
"projectFileDependencyGroups": {
".NETCoreApp,Version=v1.1": [
"Microsoft.NETCore.App >= 1.1.2"
]
},
"packageFolders": {
"C:Usersshozoa.nugetpackages": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": 省略
"frameworks": {
"netcoreapp1.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"target": "Package",
"version": "1.1.2"
}
project.assets.json 抜粋 続き 3/4
"Microsoft.NETCore.App/1.1.2": {
"type": "package",
"dependencies": {
"Libuv": "1.9.1",
"Microsoft.CSharp": "4.3.0",
"Microsoft.CodeAnalysis.CSharp": "1.3.0",
"Microsoft.CodeAnalysis.VisualBasic": "1.3.0",
"Microsoft.DiaSymReader.Native": "1.4.1",
"Microsoft.NETCore.DotNetHostPolicy": "1.1.2",
"Microsoft.NETCore.Runtime.CoreCLR": "1.1.2",
省略
"NETStandard.Library": "1.6.1",
},
"compile": {
"lib/netcoreapp1.0/_._": {}
},
"runtime": {
"lib/netcoreapp1.0/_._": {}
}
},
project.assets.json 抜粋 続き 4/4
"NETStandard.Library/1.6.1": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.Win32.Primitives": "4.3.0",
"System.AppContext": "4.3.0",
"System.Collections": "4.3.0",
"System.Collections.Concurrent": "4.3.0",
"System.Console": "4.3.0",
省略
"System.Runtime": "4.3.0",
"System.Text.Encoding": "4.3.0",
"System.Text.Encoding.Extensions": "4.3.0",
"System.Text.RegularExpressions": "4.3.0",
"System.Threading": "4.3.0",
"System.Threading.Tasks": "4.3.0",
"System.Threading.Timer": "4.3.0",
"System.Xml.ReaderWriter": "4.3.0",
"System.Xml.XDocument": "4.3.0"
}
プロジェクトの実行
• dotnet run
• もしくは
dotnet binDebugnetcoreapp1.1test.dll
objDebugnetcoreapp1.1 ビルドの中間モジュール
binDebugnetcoreapp1.1 ビルド結果
アセンブリの依存関係
アセンブリの依存関係
• 実行したアセンブリは、test.dll
• 拡張子は「exe」ではない
• アセンブリ依存関係では、.NET Framework へ移送している
• 実際に動作しているランタイムは何か?
System.Runtime 4.1.0.0
System.Console 4.0.0.0
Windows における実行時のランタイム
donet
アセンブリ dll
ランタイム CoreCLR
.NET
Framework
exe
CLRBCL
CoreFX
型を参照するとは何か
using System;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var s = Console.ReadLine();
}
}
}
メタデータ 1/2
Token Version Flags 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 Namespace
01000003 23000001 DebuggableAttribute System.Diagnostics
…
01000008 23000001 Object System
01000009 23000002 Console System
TypeRef(0x01)
TypeRef メタデータは、ResolusionScope によってアセンブリを特定する
AssemblyRef メタデータは、アセンブリ識別子を記録している
メタデータ 2/2
Token ResolutionScope Name Namespace
01000003 23000001 DebuggableAttribute System.Diagnostics
…
01000008 23000001 Object System
01000009 23000002 Console System
TypeRef(0x01)
Token MemberRefParent Name Signature
0a000001 01000001 .ctor 0x20010108 (引数1、I4、void)
…
0a000007 01000009 WriteLine 0x0001010e (引数1、string、void)
0a000008 01000009 ReadLine 0x00000e (引数無し、string)
MemberRef(0x0a)
シグネチャは、メソッドの呼び出し規約、パラメータ、戻り値などを符号化した値
シグネチャによって、オーバーロードされたメソッドを特定できる
Bait and Switch
• 型を参照することをメタデータでは
• アセンブリ参照(アセンブリ識別子)
• 型(クラス)名
• メソッド名とメソッド シグネチャ
• パッケージ システムを使ったテクニック
• コンパイル時は、メタデータのみを解決
• 配布時にプラットフォーム固有のアセンブリに置き換える
• メタデータの特徴を活用したテクニック
• AssemblyRef, TypeRef, MemberRef
ASP.NET Core
• ASP.NET MVC
• .NET Framework に対する追加の Web フレームワーク
• HTTP モジュールと組み合わせて、MVC を実現
• モデル、コントローラー、ビュー (ビュー エンジンを提供)
• ASP.NET Core として、オープンソース化
• ミドルウェア パイプライン
• HTTP モジュール パイプラインの OSS 実装
• 実装したサーバーが、Kestrel
libuv (node.js が使用している非同期ライブラリ)
実運用には、リバース プロキシを推奨
まとめ
• .NET Core とは CLI を実装したもの
• CLI に完全に準拠はできていない
• AppContext – AppDomain
• マルチ プラットフォーム対応
• Bait and Switch テクニックによる
• .NET Standard ライブラリ
• API セットによる依存関係管理の仕組み
• バージョン番号による互換性管理

Dot netcore multiplatform 2

  • 1.
    .NET Core と マルチプラットフォーム 荒井 省三 日本マイクロソフト株式会社
  • 2.
    アジェンダ • .NET Core概要 • CLI ランタイムの仕組み • 標準化 • マルチプラットフォームでは • .NET CLI と .NET Framework • まとめ
  • 3.
    .NET Core とは .NETFramework .NET Core XAMARIN アプリ モデル ベース ライブラリ
  • 4.
    .NET Core とは .NETFramework .NET Core XAMARIN アプリ モデル ベース ライブラリ
  • 5.
  • 6.
    アセンブリ (Assembly ) •プログラムの入れ物 • Portable Executable フォーマット PE ヘッダー PE 拡張ヘッダー メタデータ ヘッダー メタデータ CLI で規定された ファイル フォーマット
  • 7.
    標準化 • Common LanguageInfrastructure ISO/IEC 2721 ECMA-335 JIS X3016 • Microsoft Open Promise • Microsoft Reference Source • .NET Core - MIT License
  • 8.
    CLI とは (※) •第1章 概念とアーキテクチャ • 第2章 メタデータ定義及び意味論 • 第3章 CIL 命令集合 • 第4章 プロファイル及びライブラリ • 第5章 デバッグ情報交換形式 • 第6章 付属書 適用範囲、見本プログラム、CIL アセンブラの実装、 クラス ライブラリの設計ガイドライン、可搬性に関する考察、 厳密でない違反、並列ライブラリ ※JIS X3016 より引用
  • 9.
    第 1 章概念とアーキテクチャ (※) • 6. 共通言語基盤の概要 型安全との関係、管理下駆動実行との関係 • 7. 共通言語仕様 (CLS) • 8. 共通型システム (CTS) • 9. メタデータ • 10. 共通言語仕様のための名前及び型の規則 ※JIS X3016 より引用
  • 10.
    6. 共通言語基盤の概要 (※) •共通型システム (CTS) • メタデータ • 共通言語仕様 (CLS) • 仮想実行システム (VES) 仮想実行システム(VES)はCTSモデルを実装し強制する。VESは, CLIのために書かれたプログラムのロード及び実行を行う。 • CLIのこれらの側面は,分散コンポーネント及びアプリケーション を設計し,開発し,配置し,実行するための統一フレームワークを 形作る。 ※JIS X3016 より引用
  • 11.
    第 2 章メタデータ及び意味論 (※) • 24. メタデータの物理的な配置 PE (Portable Executable) フォーマット ※JIS X3016 より引用
  • 12.
  • 13.
  • 14.
    VES の仕組みを考えてみる アセンブリ メタデータ ローダー実行時クラス情報 EEClass クラス ローダー フィールド データ インスタンス メソッド テーブル メソッドA メソッドB メソッドC … CIL テーブル 実装A 実装B 実装C … Native Cache 実装A 実装B 実装C … JIT 実行時クラス インスタンス
  • 15.
    VES の特徴 • ターゲットを特定していない仮想実行システム •アセンブリ (PE フォーマット) をロードする • 管理下データ (Managed Data) = GC • 型安全 (Type Safe) = スタック ウォークなど • アプリケーション ドメインが実行単位 CLRは、アプリ、Shared、System の 3ドメイン • コードの最適化 = JIT による実行時の最適化 ターゲット プラットフォームごとに異なる JIT 実装が可能 AOT や NGEN は、実行時の最適化ではない
  • 16.
    マルチプラットフォームで同じか? .NET Framework .NETCore XAMARIN アプリ モデル ベース ライブラリ
  • 17.
    同じコードか? • 仮想実行システム (VES) •同じサービスを提供できれば問題ない • プラットフォームごとに、システム コールなどが違っている • ライブラリ • 同じサービスを提供できれば問題ない = API セット • プラットフォームに依存するものは、異なる実装 • コンパイラ • 同じサービスを提供できれば問題ない • コードの最適化はプラットフォームごとに違っているもの
  • 18.
    同じコードでないのに配布可能なのは? • .NET CLIでは、publish オプション を使用 • Publish オプションは何かをしている • Framework や Runtime オプションがある • 指定しなければ、全てのプラットフォームがターゲット • Runtime オプションを指定すれば、目的のプラットフォームのみ
  • 19.
    .NET Standard とは何か •CLI のおける FCL(Framework Class Library) に相当? • .NET Framework における BCL(Base Class Library) に相 当? • CoreFX とは違うもの • Mscorlib + に相当 • 実体は何か? • メタ パッケージ • NETStandard.Library によって記述されるパッケージは、プラット フォームのベースに位置するので、特別に扱われます(※)。 ※doc.microsoft.com より引用
  • 20.
    パッケージ (※) • メタパッケージ •NETStandard.Library • Microsoft.NETCore.App • フレームワーク • フレームワーク バージョンは、新しい API が追加されると更新され ます。 • netcoreapp • netstandard • ランタイム識別子 (RID) • ターゲットのプラットフォームを識別する ※doc.microsoft.com より引用
  • 21.
    新規プロジェクト • dotnet newconsole –o test • test フォルダ • Test.csproj • Program.cs
  • 22.
    test.csproj • フレームワークが 「netcoreapp1.1」と定義 •Microsoft.NET.Sdk が、.NET Core SDK を意味する <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp1.1</TargetFramework> </PropertyGroup> </Project>
  • 23.
    パッケージのリストア • dotnet restore •Obj フォルダ project.assets.json Nuget パッケージの構成ファイル test.csproj.nuget.g.props プロジェクト プロパティの構成ファイル test.csproj.nuget.g.targets Msbuild の targets ファイル
  • 24.
    project.assets.json 抜粋 1/4 { "version":2, "targets": { ".NETCoreApp,Version=v1.1": { "Libuv/1.9.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.0.1" }, "runtimes/fedora-x64/native/libuv.so": { "assetType": "native", "rid": "fedora-x64" }, "runtimes/win7-x64/native/libuv.dll": { "assetType": "native", "rid": "win7-x64" }, } } },
  • 25.
    project.assets.json 抜粋 続き2/4 "projectFileDependencyGroups": { ".NETCoreApp,Version=v1.1": [ "Microsoft.NETCore.App >= 1.1.2" ] }, "packageFolders": { "C:Usersshozoa.nugetpackages": {} }, "project": { "version": "1.0.0", "restore": { "projectUniqueName": 省略 "frameworks": { "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "target": "Package", "version": "1.1.2" }
  • 26.
    project.assets.json 抜粋 続き3/4 "Microsoft.NETCore.App/1.1.2": { "type": "package", "dependencies": { "Libuv": "1.9.1", "Microsoft.CSharp": "4.3.0", "Microsoft.CodeAnalysis.CSharp": "1.3.0", "Microsoft.CodeAnalysis.VisualBasic": "1.3.0", "Microsoft.DiaSymReader.Native": "1.4.1", "Microsoft.NETCore.DotNetHostPolicy": "1.1.2", "Microsoft.NETCore.Runtime.CoreCLR": "1.1.2", 省略 "NETStandard.Library": "1.6.1", }, "compile": { "lib/netcoreapp1.0/_._": {} }, "runtime": { "lib/netcoreapp1.0/_._": {} } },
  • 27.
    project.assets.json 抜粋 続き4/4 "NETStandard.Library/1.6.1": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0", "Microsoft.Win32.Primitives": "4.3.0", "System.AppContext": "4.3.0", "System.Collections": "4.3.0", "System.Collections.Concurrent": "4.3.0", "System.Console": "4.3.0", 省略 "System.Runtime": "4.3.0", "System.Text.Encoding": "4.3.0", "System.Text.Encoding.Extensions": "4.3.0", "System.Text.RegularExpressions": "4.3.0", "System.Threading": "4.3.0", "System.Threading.Tasks": "4.3.0", "System.Threading.Timer": "4.3.0", "System.Xml.ReaderWriter": "4.3.0", "System.Xml.XDocument": "4.3.0" }
  • 28.
    プロジェクトの実行 • dotnet run •もしくは dotnet binDebugnetcoreapp1.1test.dll objDebugnetcoreapp1.1 ビルドの中間モジュール binDebugnetcoreapp1.1 ビルド結果
  • 29.
  • 30.
    アセンブリの依存関係 • 実行したアセンブリは、test.dll • 拡張子は「exe」ではない •アセンブリ依存関係では、.NET Framework へ移送している • 実際に動作しているランタイムは何か? System.Runtime 4.1.0.0 System.Console 4.0.0.0
  • 31.
  • 32.
    型を参照するとは何か using System; namespace ConsoleApplication { publicclass Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); var s = Console.ReadLine(); } } }
  • 33.
    メタデータ 1/2 Token VersionFlags 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 Namespace 01000003 23000001 DebuggableAttribute System.Diagnostics … 01000008 23000001 Object System 01000009 23000002 Console System TypeRef(0x01) TypeRef メタデータは、ResolusionScope によってアセンブリを特定する AssemblyRef メタデータは、アセンブリ識別子を記録している
  • 34.
    メタデータ 2/2 Token ResolutionScopeName Namespace 01000003 23000001 DebuggableAttribute System.Diagnostics … 01000008 23000001 Object System 01000009 23000002 Console System TypeRef(0x01) Token MemberRefParent Name Signature 0a000001 01000001 .ctor 0x20010108 (引数1、I4、void) … 0a000007 01000009 WriteLine 0x0001010e (引数1、string、void) 0a000008 01000009 ReadLine 0x00000e (引数無し、string) MemberRef(0x0a) シグネチャは、メソッドの呼び出し規約、パラメータ、戻り値などを符号化した値 シグネチャによって、オーバーロードされたメソッドを特定できる
  • 35.
    Bait and Switch •型を参照することをメタデータでは • アセンブリ参照(アセンブリ識別子) • 型(クラス)名 • メソッド名とメソッド シグネチャ • パッケージ システムを使ったテクニック • コンパイル時は、メタデータのみを解決 • 配布時にプラットフォーム固有のアセンブリに置き換える • メタデータの特徴を活用したテクニック • AssemblyRef, TypeRef, MemberRef
  • 36.
    ASP.NET Core • ASP.NETMVC • .NET Framework に対する追加の Web フレームワーク • HTTP モジュールと組み合わせて、MVC を実現 • モデル、コントローラー、ビュー (ビュー エンジンを提供) • ASP.NET Core として、オープンソース化 • ミドルウェア パイプライン • HTTP モジュール パイプラインの OSS 実装 • 実装したサーバーが、Kestrel libuv (node.js が使用している非同期ライブラリ) 実運用には、リバース プロキシを推奨
  • 37.
    まとめ • .NET Coreとは CLI を実装したもの • CLI に完全に準拠はできていない • AppContext – AppDomain • マルチ プラットフォーム対応 • Bait and Switch テクニックによる • .NET Standard ライブラリ • API セットによる依存関係管理の仕組み • バージョン番号による互換性管理