More Related Content Similar to Dot netcore multiplatform 2 Similar to Dot netcore multiplatform 2 (20) Dot netcore multiplatform 22. アジェンダ
• .NET Core 概要
• CLI ランタイムの仕組み
• 標準化
• マルチプラットフォームでは
• .NET CLI と .NET Framework
• まとめ
6. アセンブリ (Assembly )
• プログラムの入れ物
• Portable Executable フォーマット
PE ヘッダー
PE 拡張ヘッダー
メタデータ
ヘッダー
メタデータ
CLI で規定された
ファイル フォーマット
7. 標準化
• Common Language Infrastructure
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 より引用
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 は、実行時の最適化ではない
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 より引用
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 ビルド結果
33. メタデータ 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 メタデータは、アセンブリ識別子を記録している
34. メタデータ 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)
シグネチャは、メソッドの呼び出し規約、パラメータ、戻り値などを符号化した値
シグネチャによって、オーバーロードされたメソッドを特定できる
35. Bait and Switch
• 型を参照することをメタデータでは
• アセンブリ参照(アセンブリ識別子)
• 型(クラス)名
• メソッド名とメソッド シグネチャ
• パッケージ システムを使ったテクニック
• コンパイル時は、メタデータのみを解決
• 配布時にプラットフォーム固有のアセンブリに置き換える
• メタデータの特徴を活用したテクニック
• AssemblyRef, TypeRef, MemberRef
36. ASP.NET Core
• ASP.NET MVC
• .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 セットによる依存関係管理の仕組み
• バージョン番号による互換性管理