Win10 Tools 1.1 の .NET および UWP の最新情報
本記事は、マイクロソフト本社の The Visual Studio Blog の記事を抄訳したものです。 【元記事】 What's new for .NET and UWP in Win10 Tools 1.1 2015/09/28 8:19 AM |
今回は、Managed Languages チームでプログラム マネージャーを務める Lucian Wischik による記事をご紹介します。
先週、ユニバーサル Windows アプリ用 Visual Studio ツール (英語) が更新されました。更新版は、Visual Studio の [ツール]、[拡張機能と更新プログラム] から簡単に入手できます (リリース ノート (英語) もご確認ください)。
更新の一部として、アプリのサイズを縮小する新しいオプトイン プレリリース版の機能が追加されました。
今回は、この新機能の特長と使い方についてご説明します。また、より広い視点でのメリットとして、.NET の機能強化を UWP アプリに適用する方法もご紹介します。
.NET API を含む UWP アプリの課題
従来は、構築した UWP アプリ内に、必要な .NET API がすべて含まれていました。
しかし、これには「アプリのサイズが大きすぎるのでは?」というご指摘がありました。
実際の例をご紹介します。Windows 10 デバイス (デスクトップ/モバイルの両方) で動作するシミュレーション ゲーム「ライフ ゲーム」のソース コードを作成し、Win2d ライブラリ (英語) を利用して、各デバイスのグラフィックアクセラレータで実行してみました。ソース コードは GitHub (英語) からご覧いただけます。シミュレーションゲームのパターンは以下のとおりです。
また、以下のグラフは、アプリをリリース モードで構築した結果です。新機能の導入前と導入後の結果には大きな差が見られます。
Win10 Tools 1.1 には、.NET ライブラリに起因する灰色部分の容量を排除する機能が追加されました。
新機能のしくみ
アプリケーションのサイズを縮小する機能は、現時点ではプレリリース版です。いずれ既定の機能として導入予定ですが、Win10 Tools 1.1 リリースではオプトインとなっています。
- 今回初の一般リリースとなるため、すべてのお客様への提供前にテスト期間が必要となります。
- ほぼすべてのアプリで、リリース ビルドの所要時間が短縮されます。基本的に 30% 程度短縮される見込みですが、アプリによって多少時間がかかる場合もあります。現在、より一貫した結果を得るための対応を行っています。
- VS2015 Update 1 へのアップグレード後に、プロジェクト内でこのフラグが使用されている場合は、プロジェクトをアップグレードしないと開けなくなる場合があります。この問題はまだ解決されていません。
- このフラグを使ってストアに提出したアプリは問題なく機能します。
機能のしくみ : この機能を有効にすると、.NET Native リリース ビルドから、従来アプリに含まれていた .NET のセグメントが排除され、"Shared AppX Framework Package" を通じて .NET が提供されるようになります。詳しくは次のようになります。
- お客様がストアからアプリをダウンロードする際には、.NET のセグメントは含まれていません。
- その後、適切なバージョンの .NET がオンデマンドで自動的にストアからダウンロードされ、対象のすべてのアプリで共有されます。
アプリの bin\Release\x86\ilc\AppxManifest.xml ファイルを開くと、次のような行があります。ストアアプリは、これに従ってインストールされます。
<PackageDependency Name="Microsoft.NET.Native.Framework.1.2"
MinVersion="1.2.23231.0" />
SharedFramework の使用をオプトインする方法
既にご説明したように、この機能は最終的に既定で自動化されますが、それまでは、構成フラグを使用してオプトインする必要があります。Visual Studio で UWP プロジェクトを右クリックして、アンロードします。再度右クリックし、.vbproj/.csproj を編集します。proj ファイル内で <UseDotNetNativeToolchain> を検索し (全 3 か所)、それぞれの下に次の新しいディレクティブを追加します。既定では、.NET Native ツール チェーンは、Release|x86、Release|x64、Release|Arm の 3 か所で使用されます。
次に、プロジェクトを再度右クリックして、再読み込みとリビルドを実行します。
ヒント: アンロードと再読み込みの代わりに、メモ帳など VS 以外のツールを使って proj ファイルを編集する方法もあります。VS はプロジェクトの再読み込みが必要であるかどうかを自動的に検出します。
ガイダンス : 以下に、このフラグの使い方を示します。
- 一度試してみる : 少なくとも一度はフラグをオンにして、リリース モードでのビルド時間が短縮されるかどうか、問題が発生しないかどうかを確認してください。
- 提出方法を決める : 日々の開発/テスト業務の中で、提出時と同じ方法でフラグを使用します。
- ストアへの提出 : アプリ サイズを縮小してビルド時間を短縮するメリットと、プレリリース版の機能を使用するリスクについては、お客様の判断となります。
- サンプルコードを作成する場合 : フラグをオフにしておくと、次にサンプルを作成しやすくなります。
- .NET のアウトオブバンド更新を使用する場合 : フラグをオフにしてください。
.NET の強化機能を活用するには
.NET には定期的に多くの機能強化が加えられています。この機能を活用する方法をご紹介します。
例を挙げて説明していきます。VS2015 RTM を使用して UWP アプリを開発すると想定してください。次のコードを使用します。
見慣れないコードですが、これはあまり一般的でない式ツリーを使用する .NET フレームワークの一部です。Expression.Update の呼び出しを妨げる .NET バグがあると、このコードは使えなくなります。
以前は .NET に問題が見つかった場合、次の一般リリースまで待つしかなく、その後もすべてのユーザーが更新をインストールする保証はありませんでした。
UWP ではこのようなことは起きません。Expression.Update の問題は GitHub 上で一般公開されているオープン ソース版の .NET で見つかり、GitHub 変更セット #2361 (英語) で修正されました。修正版は、新たに一般公開されたベータ版の NuGet パッケージ System.Linq.Expressions (英語) に含まれています。このベータ版を UWP アプリで使用するには、[Manage Nuget References] をクリックし、[Include prerelease] チェックボックスをオンにして、最新のプレリリース版パッケージを選択します。あまり一般的ではない処理ですが、この API にブロックされていたユーザーにとっては貴重な改善点です。
UWP での大きな変更点は、 .NET の更新をユーザーが自身でインストールする必要がないということです。アプリは常に、開発に使用されたものと同じバージョンの .NET を使用して、エンドユーザー マシン上で実行されます。
すべてのプレリリース パッケージと修正リストはベータ版のため、開発者の皆様には次の VS 更新が一般公開されるまで入手を待つことをお勧めします。最新の修正をすぐに適用する必要がある方は、corefx github (英語) をフォローしてください。
.NET のアウトオブバウンド更新と Shared Framework の組み合わせは不可
.NET のアウトオブバウンド更新と Shared Framework フラグを組み合わせて使用することはできません。プレリリース版の System.Linq.Erxpression では、次のようなエラーが表示されます。
"ILC1308: SharedAssembly をプロジェクト構成に適用できません。プロジェクトの依存関係が共有アセンブリが構築されたアセンブリと一致しません。共有アセンブリが構築されたバージョンと一致するように、プロジェクトの依存関係を調整する必要があります。"
まとめ
UWP アプリ開発用に欠かせない .NET Native は、今回のリリースで大幅に改善されました。
新しい Shared Framework 機能について、ぜひご意見をお聞かせください。開発時にはフラグをオンにしてください。これによって、多くの場合、ビルド時間が短縮されます。万一問題が発生した場合は、レポートをお送りください。メール (dotnetnative@microsoft.com) でお送りいただく方法と、Visual Studio 2015 のタイトル バーの上のスマイル アイコン (下図) をクリックしてお送りいただく方法があります。皆様からのたくさんのフィードバックをお待ちしています!