SlideShare a Scribd company logo
.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 セットによる依存関係管理の仕組み
• バージョン番号による互換性管理

More Related Content

PPTX
.NET Core とマルチプラットフォーム
PPTX
.NETクロスプラットフォーム
PDF
Open Liberty: オープンソースになったWebSphere Liberty
PDF
JDK9 新機能 (日本語&ショートバージョン) #jjug
PPTX
ASP.NET vNextの全貌
PDF
Recap: PowerShell Core
PDF
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
PDF
Firefoxの開発プロセス
.NET Core とマルチプラットフォーム
.NETクロスプラットフォーム
Open Liberty: オープンソースになったWebSphere Liberty
JDK9 新機能 (日本語&ショートバージョン) #jjug
ASP.NET vNextの全貌
Recap: PowerShell Core
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
Firefoxの開発プロセス

What's hot (20)

PPTX
20170624 interact2017 open shift on azure
PDF
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
PDF
.NET Core 1.0
PDF
IBMが新しいJava EEコンテナを作っているらしい -Libertyプロファイルとは-
PPTX
PowerShell の基本操作とリモーティング&v3のご紹介 junichia
PDF
OpenJDK コミュニティに参加してみよう #jjug
PDF
jjugccc2018 app review postmortem
PDF
Open Liberty / WebSphere Liberty
PDF
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
PDF
WebSphere Application Server V8.5.5 Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51
PDF
JJUG 11月ナイトセミナー CDIをはじめよう
PDF
.NET 5 勉強会 ~.NET Framework から .NET へ~
PPTX
Panamaを先取り!? JVMCIでJITと遊ぶ
PDF
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
PPTX
ついに始まるJava EE 7時代のアプリケーション開発
PDF
最近の PowerShell のお話
PPTX
OpenShift from Easy way to Hard ? Way
PDF
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
PDF
Java EE 6で復活するエンタープライズJavaの世界
PDF
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
20170624 interact2017 open shift on azure
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
.NET Core 1.0
IBMが新しいJava EEコンテナを作っているらしい -Libertyプロファイルとは-
PowerShell の基本操作とリモーティング&v3のご紹介 junichia
OpenJDK コミュニティに参加してみよう #jjug
jjugccc2018 app review postmortem
Open Liberty / WebSphere Liberty
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
WebSphere Application Server V8.5.5 Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51
JJUG 11月ナイトセミナー CDIをはじめよう
.NET 5 勉強会 ~.NET Framework から .NET へ~
Panamaを先取り!? JVMCIでJITと遊ぶ
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
ついに始まるJava EE 7時代のアプリケーション開発
最近の PowerShell のお話
OpenShift from Easy way to Hard ? Way
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Java EE 6で復活するエンタープライズJavaの世界
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
Ad

Similar to Dot netcore multiplatform 2 (20)

PPTX
CLI と BCL
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PDF
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
PPTX
Modern .NET
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PDF
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース!
PDF
DEV-002_.NET Core/ASP.NET Core が実現するクロスプラットフォーム .NET の今と未来
PDF
.NET Core 5 ~ Windows, Linux, OS X そして Docker まで ~
PDF
デモで楽しむ Visual Studio 2022 & .NET 6 最新アップデート
PDF
.NET Coreから概観する.NETのOSSへの取り組み
PDF
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
PDF
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
PDF
Dotnetcore30forwindesktop
PDF
Introduction to VSCode
PDF
Getting Started .NET Core
PPTX
.NETの最近
PPTX
広がる .Net
PDF
【BS2】.NET 6 最新アップデート
PPTX
20160709 .NET Core on RHEL
PDF
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
CLI と BCL
今から始める、Windows 10&新.NETへの移行戦略
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Modern .NET
今から始める、Windows 10&新.NETへの移行戦略
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース!
DEV-002_.NET Core/ASP.NET Core が実現するクロスプラットフォーム .NET の今と未来
.NET Core 5 ~ Windows, Linux, OS X そして Docker まで ~
デモで楽しむ Visual Studio 2022 & .NET 6 最新アップデート
.NET Coreから概観する.NETのOSSへの取り組み
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
Dotnetcore30forwindesktop
Introduction to VSCode
Getting Started .NET Core
.NETの最近
広がる .Net
【BS2】.NET 6 最新アップデート
20160709 .NET Core on RHEL
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
Ad

Dot netcore multiplatform 2

  • 1. .NET Core と マルチ プラットフォーム 荒井 省三 日本マイクロソフト株式会社
  • 2. アジェンダ • .NET Core 概要 • CLI ランタイムの仕組み • 標準化 • マルチプラットフォームでは • .NET CLI と .NET Framework • まとめ
  • 3. .NET Core とは .NET Framework .NET Core XAMARIN アプリ モデル ベース ライブラリ
  • 4. .NET Core とは .NET Framework .NET Core XAMARIN アプリ モデル ベース ライブラリ
  • 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 は、実行時の最適化ではない
  • 16. マルチプラットフォームで同じか? .NET Framework .NET Core 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 new console –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 ビルド結果
  • 30. アセンブリの依存関係 • 実行したアセンブリは、test.dll • 拡張子は「exe」ではない • アセンブリ依存関係では、.NET Framework へ移送している • 実際に動作しているランタイムは何か? System.Runtime 4.1.0.0 System.Console 4.0.0.0
  • 32. 型を参照するとは何か using System; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); var s = Console.ReadLine(); } } }
  • 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 セットによる依存関係管理の仕組み • バージョン番号による互換性管理