しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Connect(); // 2015 でリリースされた DNX と .NET Core / CLI について調べた

Connect(); // 2015 では ASP.NET 5 (DNX) や .NET Core の RC 1 が出たので、自分なりに整理するために色々と調べて OS X 上で実際に試してみました。

RC 1 ではちゃんとインストーラーやドキュメントが用意されているので簡単です。

DNX / ASP.NET 5

http://get.asp.net/

ASP.NET 開発を始めるためのポータルサイト的なものがちゃんと用意されました。インストーラーをダウンロードした後、開発ツールも同時にダウンロードできるようになってます。

ちゃんと日本語化されているのにちょっと驚きました。Additional DNX Platforms を開くと Windows や Linux 用の DNX をインストールすることもできます。

dnu publish を使って別プラットフォーム向けにパッケージングする時に必要になります。

インストールの完了後、dnvm list を叩くと CoreCLR と Mono 版が入っているのが確認できます。アーキテクチャは当初の予定通り x64 のみになっています。

DNX アプリケーションの実行方法はお馴染みの dnu restore -> dnx run という流れです

# NuGet から必要なパッケージをインストール
dnu restore

# アプリケーションを実行
dnx run

これだけであっさりと CoreCLR を使って C# アプリケーションが動作しました。5 分ぐらいで終わります。

思っていた以上にすんなりとインストールから実行まで出来ました。完成度の高まりを感じます。

.NET Core & Command Line Interface

http://dotnet.github.io/

もう一つ、キーノートで Scott Hanselman が使っていた dotnet コマンドですが、こっちは .NET Command Line Interface というものになるようです。.NET Core のインストールと同時に入ります。

インストールすると dotnet コマンドが使えるようになります。手っ取り早く試すには dotnet init コマンドを実行するとサンプルコードと project.json を生成してくれます。

# project.json とサンプルコードを作成
dotnet init

# NuGet から必要なパッケージをインストール(dnu コマンドと中身は同じ)
dotnet restore

# アプリケーションを実行
dotnet run

結局のところは restore してから run で実行という流れになりますが、今のビルドは OS X での動作に問題があるようです。restore までは上手くいきますが、その先の実行で例外となります。

既に同様の Issue が GitHub に上がっているので、新しいビルドで直る可能性が高そうです。DNX とは異なり、まだこっちは開発途中という感じがしていますね。

Minimal console app unhandled FileNotFoundException · Issue #4443 · dotnet/sdk · GitHub

ちなみにキーノートのデモで Scott Hanselman がやっていた、C# で書いたコンソールアプリケーションをネイティブコードにコンパイルする機能は、現在は Windows と Ubuntu 限定のようです。

Note: the below is currently working on Windows and Ubuntu - OS X support coming soon!

GitHub - dotnet/cli: The .NET Core command-line (CLI) tools, used for building .NET Core apps and libraries through your development flow (compiling, NuGet package management, running, testing, ...).

OS X も間もなくサポートということなので、対応したバージョンがリリースされたら再度挑戦してみます。

エントリポイントについて

少し、DNX でのエントリポイントについて誤解していた部分があったので、自分の中での情報の整理のためにまとめておきます。Twitter で藤原さんに言われて、勘違いしていることに気がつきました。

どうやら CoreCLR というか CoreFX の Assembly クラスの EntryPoint プロパティがこれまで公開されておらず、DNX 側で CoreCLR の場合のみリフレクションを使って取得していたようです。

Support Main entrypoint on CoreCLR · Issue #3020 · aspnet/dnx · GitHub

.NET Framework 側と挙動を合わせるために、Assembly.EntryPoint の追加を行ったのが以下の Issue と Pull Request です。CoreFX には何故か存在しなかったようです。

Expose Assembly.EntryPoint · Issue #15245 · dotnet/runtime · GitHub
Expose Assembly.EntryPoint via public contract by nguerrera · Pull Request #3999 · dotnet/corefx · GitHub

DNX 内の EntryPointExecutor クラスのコメントには、既存のコンソールアプリケーションを DNX で動作させるために追加したとありました。EntryPoint はコンパイル時に決まるはずなので、無駄にリフレクションを使いたくなかったのかも知れません。

そしてもう一つエントリポイントに関連する話として、DNX で利用可能なエントリポイントが RC 2 からは static void/int Main だけになるという話です。

Moving towards unification of entry point semantics with desktop CLR · Issue #113 · aspnet/Announcements · GitHub

これまでは Task/Task<int> を返すことも出来たのを、既存のアプリケーション側に統一するようです。

ここまでの話をまとめると以下のようになります。

  1. 既存の .NET Framework と同じ static void Main エントリポイントに統一する
    • DNX 1.0.0-rc2 で async Task/Task<int> などの特殊な Main エントリポイントは廃止
    • これは dnx-clr / dnx-coreclr の両方に適用される
  2. ASP.NET 5 は Hosting ライブラリが Main エントリポイントを持っていたのを変更
    • Main 自体は残っているけど、処理自体は WebApplication.Run メソッドに移された
  3. .NET Command Line Interface を使った場合も同じ挙動になるはず
    • 中身は DNX そのままのようなので

Main 内で async/await をそのまま使えなくなったのはもったいない気はします。

おまけ

SGT で行われたレアイベントにて、ASP.NET 5 RC 1 について少しだけ話してきました。スライドは docs.com で公開しています。

Main エントリポイントについては説明不足だったので、今回このエントリを書きました。