modern .net
TRANSCRIPT
Modern .NET
C# とともに祝 15 周年岩永信之
++C++; // 未確認飛行 C
Modern .NET
• .NET 2015 と呼ばれてる一連の製品既存技術系 2015 世代系
.NET .NET Framework 4.6
.NET Core 5• ASP.NET 5• "Modern" PCL‡
• UWP†
プロジェクト形式 csproj/vbproj xproj
パッケージ参照 package.config project.json(NuGet v3)
ターゲットバージョン
net45, netcore45, MonoAndroid10, ...
dotnet
beta
RTM
beta
† Portable Class Library‡ Universal Windows Platform
beta
beta
RTM
beta
• .NET Core とか ASP.NET 5 はまだベータ• 全部ベータだと思ってたら一部 RTM だった たぶん
今日話すこと
既存技術系 2015 世代系.NET .NET Framework
4.6.NET Core 5• ASP.NET 5• "Modern" PCL‡
• UWP†
プロジェクト形式 csproj/vbproj xproj
パッケージ参照 package.config project.json(NuGet v3)
ターゲットバージョン
net45, netcore45, MonoAndroid10, ...
dotnet
beta
RTM
beta
† Portable Class Library‡ Universal Windows Platform
beta
beta
RTM
beta
• 何が RTM で何がベータかわかるように• RTM な部分を少し詳細に説明
• .NET 2015 と呼ばれてる一連の製品
リリース状況• .NET 2015 と呼ばれてる一連の製品
既存技術系 2015 世代系.NET .NET Framework
4.6.NET Core 5• ASP.NET 5• "Modern" PCL‡
• UWP†
プロジェクト形式 csproj/vbproj xproj
パッケージ参照 package.config project.json(NuGet v3)
ターゲットバージョン
net45, netcore45, MonoAndroid10, ...
dotnet
beta
RTM
beta
† Portable Class Library‡ Universal Windows Platform
beta
beta
RTM
beta
赤枠Visual Studio 2015 を入れるとベータ版テンプレートが入ってる
青枠Visual Studio Tools for Windows を入れると RTM テンプレートが入って
る
.NET Core
• .NET Framework を再実装• オープンソース• クロスプラットフォーム• modular
• 秋以降に RTM しそう?• 今のところ 63% くらいっぽい†
beta
要するに• Win32 依存部分の切り離し• mscorlib の分解• 長期保守に耐えうる造りに変更
† https://github.com/dotnet/corefx-progress
CoreCLR と CoreFX
• 「 .NET 」って言葉が含む 2 つの意味
GitHub リポジトリ的にも別れてたり
ランタイム 標準ライブラリ何ものか • IL を JIT して実行
• GC とかの実行時処理• 規約 ( どのクラスをどの
プラットフォームで使えるか )• その実装
.NET Core CoreCLR† CoreFX‡beta beta
† https://github.com/dotnet/coreclr‡ https://github.com/dotnet/corefx
GitHub リポジトリ的にも別れてたり
• 規約的には Windows ストア アプリ向け .NET と同系統• 実装は新規 (mscorlib を分解 + クロスプラットフォーム
化 )
同世代の別技術に.NET Native あり
RTM
Modular アーキテクチャCollection
sThreading
Reflection
Linq
Net
IO …
Modern(.NET Core)
Legacy(.NET Framework) mscorlib※
※ 正確にはいくつかのクラスは System.dll とかに分かれてるけど、それでもかなりでかい単位
• 機能単位でアセンブリを分割• 必要な時に必要な分だけ参照
して使う• 標準ライブラリも個別・
NuGet 配布
beta
既存• インストーラーで一括インス
トール
Modular アーキテクチャ ( 移行期があった )
Collections
Threading
Reflection
Linq
Net
IO …
Modern(.NET Core)
Legacy(.NET 4 まで ) mscorlib
Collections
Threading
Reflection
Linq
Net
IO …
Facades(.NET 4.5, Win8)
mscorlib
実体はこれまでの mscorlib のバージョン アップ
Fasade( 見せかけ ) アセンブリ
型の「転送」だけする本当は mscorlib で実装してるものを個別のライブラリに実装しているように見せる
beta
既存
既存
転送
( 移行期 )
(.NET 4.6 と ) 互換
互換性• ランタイムに関して• 仕様は一緒で別実装
• 標準ライブラリの規約に関して• Facades がある※ /.NET 4.5 時代から Facades を用意してた
Core 機能版 Full 機能版
Windows 8 世代 ストア アプリ .NET Framework 4.5
Windows 10 世代 .NET Core 5UWP†
.NET Framework 4.6
おおむね上位互換 (Full = Core + Win32)
バージョンアップ
RTMbeta
既存既存
RTM互換
†Universal Windows Platform
※ NuGet v3 は mscorlib への転送を自動的にやってくれるみたい
.NET Core 系プロジェクト• ASP.NET 5
• "Modern PCL"
• Universal Windows Platform (UWP)
beta
RTM
beta
.NET Core
.NET Framework※ 両対応
• デバッグ時には CoreCLR 上で普通に実行
• 配布前に .NET Native でネイティブ化• 標準ライブラリ規約的には .NET Core
.NET Core 規約で
作っておけばどこでも動く
※ 現時点では ( たぶん今後も ) .NET Framework 4.5 以降のみ
RTM
beta
xproj
• xproj: プロジェクトの新しいファイル形式• XML でソースコード管理するのやめました• 基本、フォルダー以下にある全ソースコードがビルド対象• 除外したいものは、 project.json の中に除外設定を書く
• ASP.NET 5 と Modern PCL はこれ
• csproj/vbproj• ビルド対象にしたい .cs/.vb ソースコードや、アセンブリ参照設定を
1 つ 1 つ XML で記述
beta
beta beta
既存
project.json (xproj 系 )
• xproj はほぼ空• プロジェクト設定は project.json に書く• これまで nuspec に書いてたようなパッケージ情報• 依存するライブラリの情報
• これを使えるプロジェクトのタイプ• ASP.NET 5
• Modern PCL
beta
beta
beta
project.json (NuGet v3)
• csproj/vbproj でも project.json を使うように• xproj での project.json のサブセット
• 依存ライブラリに関する情報だけ• package.config (NuGet v2 まで ) の置き換え
• これを使えるプロジェクトのタイプ• UWP• ( 未保証でよければ ) その他なんでも
• プロジェクト テンプレートにはなってなくて手動で package.config を project.json に差し替えたら動く( 要プロジェクト再読み込み )
RTM
RTM
既存
project.json (NuGet v3) の中身• csproj 中で動かす
最低ラインの書き方• runtimes とかを抜くと
意味不明のビルド エラーが発生
{ "frameworks": { "net35": {} }, "runtimes": { "win": {}, "win-anycpu": {} }, "dependencies": { "Newtonsoft.Json": "7.0.1" }}
ターゲット フレームワーク
ターゲット OS 、 CPU
依存ライブラリ一覧を" パッケージ名 ": " バージョン
"という形式で並べる
NuGet v3 でのパッケージ管理 ( 参照側 )
• JSON (project.json) で管理するようになった• ソリューション単位でのキャッシュ管理をやめた• 旧 : ソリューションの下に「 packages 」フォルダー• 新 : ユーザー フォルダーの下に「 .nuget/packages 」フォルダー
• csproj/vbproj汚染しなくなった• hint path とかもなくなって、 1 つのプロジェクトを複数のソリューションから参照してもパスが狂って困る問題なくなった
•多段の依存管理が楽になった• 直接参照しているものだけが project.json に入る• アンインストールやアップグレード作業がだいぶ楽
NuGet v3 でのパッケージ管理 ( 作成側 )
• install/uninstall.ps1 が働かなくなった• プロジェクト単位でインストールされない• init.ps1 は動く
• コンテンツ (contents フォルダー ) を持てない• analyzers フォルダーに DLL 入れるだけでアナライザーの参照
できるように
"dotnet" ターゲット• 今まで : ターゲットごとに「プロファイル」が分かれてた• デスクトップ向けなら net35, net45, net46, ...• ストア アプリ向けなら wp7, wp71, win8, win81, netcore45, ...• Xamarin 向けなら MonoTouch10, MonoAndroid10, ...
• 新世代 : "dotnet" 1 個だけに!• 「どのライブラリに依存してるか」だけで、どのターゲットで動くか
を自動判別• ターゲットを気にして作るのは、標準ライブラリとか Xamarin みた
いなものだけ
RTM ※
※ dotnet ターゲット (NuGet v3 が必要 ) が使えて、 RTM かつ保証があるのは現状では UWP だけ未保証・ベータ込みでも、 .NET Framework 4.6/.NET Core 5 以降のみ
"Modern PCL"
• xproj なライブラリ プロジェクト• 自動的に dotnet ターゲットな nupkg を作ってくれる
このテンプレートが Modern PCL
beta
新旧世代• 同世代技術・新技術の方がサポート早いのは当然• 世代的には .NET Core = xproj = project.json = dotnet ターゲッ
ト• 混同されがち (ひとくくりに .NET 2015 とか .NET vNext とか )
• でも、いくらか新旧混在可能• .NET Core/.NET Framework共用
• Facades がある• xproj で作ったアプリや、 dotnet ターゲットのライブラリは
.NET Framework 4.6/.NET Core 5 両対応• NuGet v3 で、 project.json を csproj/vbproj からも使える
まとめ• 新旧はっきりわかれてるけど、いくらか混在利用可能• .NET Framework ⇔ .NET Core
• ASP.NET 5, "Modern PCL", UWP
• csproj/vbproj ⇔ xproj• package.config ⇔ project.json (NuGet v3)• net45, win81, ... ⇔ dotnet
• ぶっちゃけていうと• 新しい方が使えると結構幸せ• 移行期に当たる今はたぶん余計に苦労する• UWP に合わせて NuGet v3 だけ前倒しで RTM した雰囲気
RTM
RTM
RTM 状況、実はよくわからずここからおまけ
ASP.NET 系• xproj 系プロジェクト = ASP.NET 5 系チームによる開発
「 Web 」カテゴリー内に「コンソール アプリ」って何なんだよ
xproj
xproj
xproj
beta
beta
beta
「プレビュー」の文字• ASP.NET 5 は、プレビューのところにプレビューの文字あり
「プレビュー」とは書かれてないけども
さっきの
やっぱり「 beta 」って入ってる• DNX SDK バージョン
作成
プロパティ
「プレビュー」とは書かれてないけども やっぱベータなの?
ASP.NET 系 → UWP 系• project.json = ASP.NET 系 → UWP 系
ASP.NET 5xproj
beta UWPcsproj
RTM
xproj では、プロジェクト設定全般を書く
だから「 project.json 」
サブセット
パッケージ依存管理だけを project.json に書く
• VS Tools for Windows• VS2015 RTM (7/20) よりも
後 (7/29) にリリース• csproj+project.json を使うに
はこれが必須
• UWP 用 ?
csproj+project.json は UWP 系 (1)
•任意のプロジェクト タイプに対する project.json
手作業で• packages.config削除• project.json追加• プロジェクトをリロード
csprojpackages.config
既存 csprojproject.json
RTM ?
UWP 以外であっても、 VS Tools for Windows のインストールが必須
手作業必須なのは、• 単に UWP 以外の対応が間に合って
ないのか ?• まだやって欲しくないから
テンプレートを用意してないのか ?
csproj+project.json は UWP 系 (2)
• project.json からのパッケージの復元
• csproj+project.json なプロジェクトのビルド
NuGet パッケージ マネージャーを 3.1 以上にすればできる
VS Tools for Windows が必要(UWP 以外のプロジェクト タイプであっても )( 同時に NuGet の方も更新されてた )
(7/31 にリリースしてた )
(7/29 にリリース )
.NET Core はベータ (1)
• CoreCLR にも CoreFX にも「 beta 」の文字
.NET Core はベータ (2)
• UWP は RTM
.NET Core
CoreCLR.NET
Native
ASP.NET 5 UWP
beta
beta
わかる
CoreFXbeta
.NET Framework 4.6
選べる
RTM
RTM
Debug Release
RTM
依存先がベータ?!