.NET Core への移植を簡単に

 

本記事は、マイクロソフト本社の .NET Blog の記事を抄訳したものです。【元記事】 Making it easier to port to .NET Core 2016/5/27

前回の記事では .NET Core への移植 (英語) について取り上げ、エクスペリエンスに対するご意見や改良すべき点についてコメントをいただけるようコミュニティの皆様にお願いしました。

おかげさまで、ユーザーの皆様と活発に意見交換させていただくことができました。

.NET チームは、この会話の内容と社内外のパートナーとの共同作業を踏まえて、主要な API を他の .NET プラットフォーム、特に .NET Framework や Mono/Xamarin と統合して移植作業を大幅に簡素化することにしました。

この記事では、この取り組みの計画、進め方やスケジュール、既存の .NET Core ユーザーにとってのメリットについてご説明します。

 

.NET Core への反映

.NET Core プラットフォーム (英語) は、先進的でアプリローカルなモジュール形式のクロスプラットフォーム .NET スタックを求める声から生まれました。開発を進めるうえで目標としたのは、まったく新しい種類のアプリケーション (タッチ操作対応 UWP アプリなど) や最先端のクロス プラットフォーム アプリケーション (ASP.NET Core ベースの Web サイトや Web サービスなど) 用のスタックを提供するということでした。

そして、この強力なクロス プラットフォームの開発スタックを実現することに成功し、.NET Core 1.0 のリリースは間近に迫っています。.NET Core 1.0 は、プラットフォームを問わず .NET を使用できるようにするための第一歩です。

.NET Core の機能は私たちが課題としていたシナリオに最適化されており、他の .NET プラットフォーム、特に .NET Framework と比較すると、使用可能なテクノロジが絞り込まれています。その理由としては、すべての機能がクロスプラットフォームであるわけではないことや、あえて一部の機能は除外したことなどが挙げられます。

しかし、.NET Core の登場によって、従来から .NET を使用している開発者が、.NET Core への移植作業に相当の手間を強いられているということが判明しました。

API を整理することは、確かに新規ユーザーには一定のメリットをもたらしますが、これまでマイクロソフトが皆様に勧めてきた API やテクノロジに対して長年投資してきたユーザーにとっては、逆にデメリットとなっていたのです。私たちは .NET プラットフォームの利用範囲を拡大して新規ユーザーを獲得しながら、同時に従来からのユーザーにデメリットが生じないようにしたいと考えています。

この点では Xamarin が良い成功例です。Xamarin では、.NET 開発者でも最小限の作業で iOS プラットフォームや Android プラットフォーム向けのモバイルアプリケーションを開発できます。iOS は、エンド ユーザーのエクスペリエンスを特に重視していたり静的にコンパイルを行う必要があるなど、UWP プラットフォームと類似した特性を数多く持っています。ただし、Xamarin は .NET Core の場合とは異なり、.NET スタックを再考することからスタートしたわけではありません。Xamarin は Mono をそのまま基盤とし、アプリケーションモデル コンポーネント (Windows.Forms や ASP.NET など) を削除し、iOS 用の新しいコンポーネントを追加して、組み込みでの使用に最適になるように最小限の変更を施したものです。Mono は .NET Framework と実質的に変わらないため、作成された API セットは非常に包括的であり、既存のコードを Xamarin に移植する作業は非常に容易です。

.NET では当初から、開発者の生産性を向上させると共に堅牢なコードを作成できるようにするということを大切なお約束として掲げています。また、デスクトップアプリケーションや Web アプリケーションから、マイクロサービス、モバイル アプリケーション、ゲームまで、幅広い分野やシナリオで開発者をサポートすることを常に念頭に置いています。

このお約束を実現するには、主要な API を統合してどのプラットフォームでも使用できるようにすることが欠かせません。主要な API を統合することにより各種のワークロードで容易にコードを共有できるようになるため、開発者は優れたサービスやユーザーエクスペリエンスを構築するという最も重要な作業に集中できるようになります。

 

.NET Core の将来

Scott Hunter が Build 2016 で、次のスライドを発表 (英語) しました。

clip_image002

マイクロソフトは次のことを皆様にお約束します。

デスクトップ アプリケーション、モバイル アプリ、Web サイト、マイクロサービスのいずれを構築する場合でも .NET をご活用いただけます。基本クラスライブラリ (BCL) が統合されることにより、簡単にコードを共有でき、開発者の皆様はユーザー エクスペリエンスや開発対象のプラットフォームに特化した機能やテクノロジに集中できるようになります。

このお約束を実現するために、アプリケーションのソース コードとバイナリの互換性を確保し、すべてのプラットフォームに対応する主要 BCL がどのプラットフォームでも同じように動作することを見込めるようにします。基本クラスライブラリは mscorlibSystemSystem.CoreSystem.Data、および System.Xml に含まれ、特定のアプリケーション モデルや特定の OS 実装には関連付けられません。

.NET Core 1.0 サーフェス (System.Runtime を基盤とするサーフェス) と API が拡張された将来のバージョンの .NET Core (mscorlib を基盤とするサーフェス) のいずれでも、既存のコードは引き続き正常に動作するようにします。

既存のコードを移植しやすくするというお約束は、ライブラリや NuGet パッケージでも同様です。当然、mscorlibSystem.Runtime のいずれを使用する場合でも、クラス ライブラリは移植可能です。

.NET Core を使用する際の作業を容易にするために、機能を追加します。以下はその一部です。

  • Reflection は .NET Framework と同じになります。GetTypeInfo() は不要となり、以前使用されていた .GetType() が復活します。
  • 整理する目的で削除されていたメンバー (Clone()Close()Dispose()、古い APM API) が型で使用できるようになります。
  • バイナリでのシリアル化 (BinaryFormatter) が再度可能になります。

予定されている追加機能の一覧は、GitHub の corefx リポジトリ (英語) で公開されます。

 

この取り組みの .NET Core における意味

ソーシャル メディアでコミュニティの皆様とお話ししたところ、API の追加により .NET Core のエクスペリエンスが低下するのではないかというご心配の声がありましたが、その心配は一切無用です。私たちが .NET Core に対して行っている投資の大半は、アプリローカルなデプロイメント (XCOPY によるデプロイメント) が可能であること、事前コンパイラ (AOT コンパイラ) ツール チェーンが利用できること、オープン ソースとクロス プラットフォームの性質が継続して引き継がれることを目的としています。これは、「Kestrel」という新しいネットワークコンポーネントなど、追加される機能やパフォーマンスの改善すべてに対しても同じことが言えます。

.NET Core の設計開始当初は、モジュール化についてや、ユーザーが使用する機能分のディスク領域に対して料金を支払うような有料制の導入について活発に議論しました。今後は、互換性に大きな影響を与えないようにしながら、これらの目標も実現したいと考えています。

最初の私たちの計画ではディスク容量を最小化することを目指し、機能を小さなライブラリに手作業で分割することで達成しました。これは皆様にご好評をいただきました。現在は、正確さを高め手間を省くツールを提供することに取り組んでいます。これは、Xamarin で実現されたことでもあります。

 

スケジュールとプロセス

.NET Core の API サーフェスの拡張は、.NET Core 1.0 RTM のリリース後に提供する予定です。これにより、.NET Core の進展に伴って、運用環境へのデプロイメントが可能になります。

詳細や今後の予定については、今後数週間以内に GitHub の corefx リポジトリ (英語) で公開する予定です。その第一弾として、どの API の移植を予定しているかを一覧にした API リファレンスを公開します。この一覧を参照したうえで、.NET Core 1.0 にコードを移植するか、または新たに API が追加されるまで待つかをご判断ください。移植が予定されていない API についてもお知らせします。プロジェクトの進行状況や目標が確認できるダッシュボードも用意する予定です。

これまでは社内プロセスを公開することはあまりありませんでしたが、こうした情報公開は .NET Core 1.0 のリリースに向けたプロセスにおける大きな改善点となるでしょう。

また、使用可能な API セットを拡張する .NET Core の差分更新を NuGet でリリースする予定です。ユーザーの皆様はすべての API の追加が完了するまで待たずに、API を活用することができ、それによって私たちは、動作の互換性に関する皆様からのフィードバックを受けて反映させることができます。

今後数週間以内に corefx リポジトリ (英語) で詳細を公開します。このブログでも、進行状況や重要な決定事項についてお伝えしていきます。

どうぞご注目ください!