Connect(); // 2015 では ASP.NET 5 (DNX) や .NET Core の RC 1 が出たので、自分なりに整理するために色々と調べて OS X 上で実際に試してみました。
RC 1 ではちゃんとインストーラーやドキュメントが用意されているので簡単です。
DNX / ASP.NET 5
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
もう一つ、キーノートで 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 で藤原さんに言われて、勘違いしていることに気がつきました。
@shibayan スライド8枚目、スライドの読み間違いかも知れませんし、betaのときの仕様がよくわかってないですが、デスクトップCLRと一緒になるように、coreclr「の」Mainの仕様に破壊的変更が入るってことですかね?
— FUJIWARA, Yusuke (@yfakariya) 2015年11月24日
どうやら 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 だけになるという話です。
これまでは Task/Task<int> を返すことも出来たのを、既存のアプリケーション側に統一するようです。
ここまでの話をまとめると以下のようになります。
- 既存の .NET Framework と同じ static void Main エントリポイントに統一する
- DNX 1.0.0-rc2 で async Task/Task<int> などの特殊な Main エントリポイントは廃止
- これは dnx-clr / dnx-coreclr の両方に適用される
- ASP.NET 5 は Hosting ライブラリが Main エントリポイントを持っていたのを変更
- Main 自体は残っているけど、処理自体は WebApplication.Run メソッドに移された
- .NET Command Line Interface を使った場合も同じ挙動になるはず
- 中身は DNX そのままのようなので
Main 内で async/await をそのまま使えなくなったのはもったいない気はします。
おまけ
SGT で行われたレアイベントにて、ASP.NET 5 RC 1 について少しだけ話してきました。スライドは docs.com で公開しています。
Main エントリポイントについては説明不足だったので、今回このエントリを書きました。