#はじめに
本記事は、2021 年 5 月 25 日(米国時間)ポストされた "Visual Studio 2019 v16.10 and v16.11 Preview 1 are Available Today!" の抄訳意訳(と、ちょっと手を加えたもの)となります。
内容については下記原文が正となります。
#1. Visual Studio 2019 v16.10 の新機能
この度、Visual Studio 2019 v16.10 が利用可能になり、また v16.11 Preview 1 がリリースされました。これにより、Visual Studio ユーザーの皆様の生産性や利便性の向上が見込めます。
- C++20 の機能を追加しました
- Git 統合が改善されました
- プロファイリング ツールを改善しました
- その他、生産性を高める機能を多数搭載しました(後述)
最新のリリースをダウンロードいただき、是非新機能をお試しください。フィードバックなどについては、ぜひこちらの Developer Community にお寄せください。(以下、ダウンロードリンクとコミュニティリンクとなります)
###C++ 関連
コンパイラおよび STL は最新の C++ 20 の規格に対応しています。v16.10 には、Calendar、timezone、 <format> などの対応が搭載されました。これらの機能はすべて、/std:c++latest スイッチで利用できます。
なお、一部の機能は ABI と互換性のない方法で Defect レポート(ISO C++ 20 のバグ修正)によって修正されることが予想されるため、/std:c++20 スイッチはまだ利用できません。詳細については、以下の Microsoft/STL Issue#1814 を参照してください。
<format> は、fmtlib をベースにしたテキスト フォーマットのための新しい機能です。iostreams や printf ファミリに代わる高速で安全な機能を提供します。
auto version = 20;
std::format(“STL is now C++{} feature-complete!”, version);
Calendar と timezone は既存の <chrono> 機能を拡張したものです。これらの機能は、type-safe で、time-zone を意識した方法で、日付と時刻を表現し、操作するためのものです。
std::chrono::year_month_day world_bee_day = May/20d/2021y
std::format("Buzz buzz on %F!”, world_bee_day);
また、Modules、Ranges、Concepts の IntelliSense が改善されました。Go-to-definition は、モジュール自体と、モジュールからインポートされた定義の両方で動作します。Ranges はコンパイラにとって処理が難しいことで知られていますが、IntelliSense は Ranges の補完を行うことができるようになりました。また、Concepts 内で定義された名前の補完も可能です。
LLVM OpenMP ランタイムが、x64 に加えて、x86 と ARM64 にも対応しました。これをターゲットにするには、/openmp:llvm スイッチを渡します。
C++20 スタイルの coroutine を使用したいが C++11 または C++14 をターゲットにしている場合は、/await:strict スイッチを使用して望ましい動作を得られるようになりました。
Coroutine のデバッグと可視化が改善されました。特に、std::coroutine_handle<T> の視覚化では、オリジナルの coroutine 関数名と signature、および現在のサスペンド ポイントが表示されるようになりました。(下記参照)
CMake サポートを使用している場合は、CMakeSettings.json ではなく、CMakePresets を使用して設定を指定できるようになりました。このフォーマットは、Visual Studio、Visual Studio Code、およびこの新しい標準をサポートするその他のツールで一貫しています。
###Git の生産性
ブランチ ピッカー
ステータス バーに新しいブランチ ピッカー(下図参照)が追加されました。ローカルおよびリモートのブランチをフィルタリングしたり、右クリックのコンテキストメニューから一般的なアクションを実行することができます。
ステータスバーのブランチピッカーと Git Changes ウィンドウでブランチをシングル選択すると、ローカルまたはリモートのブランチを Checkout するようになりました。
※ 左クリックでブランチをチェックアウトし、右クリックで追加のアクションを行うことができます
リポジトリ ピッカー
ステータスバーのリポジトリ ピッカーから、ローカルの Git リポジトリをフィルタリングして切り替えることができます。右クリックのコンテキストメニューでは、リストから項目を削除することができます。
※ コンテキストメニューから、リポジトリピッカーリストからアイテムを削除することができます
自分のブランチをリモートと同期させる (Pull して Push する)
ステータスバーの unpushed commits ボタンや Git メニューの Sync コマンドを使います。
入力されたコミットがない場合でも、Git リポジトリウィンドウの履歴ペインから fetch したり pull したりすることができます。これらのセクションには、ステータスバーまたはキーボードショートカットの Ctrl+0+Y からアクセスできます。
Git リポジトリ ウィンドウの Incoming セクションに、Fetch ボタンとPull ボタンのコールアウトを追加しました。
Git リポジトリのウィンドウで Commit を選択すると、他のウィンドウに移動することなく、その詳細やファイル変更の比較を表示できます。2つの Commit を選択して右クリックすると、同じウィンドウで比較することができます。詳細情報を別のウィンドウにポップアップして全画面表示し、変更内容を深く掘り下げることができます。
Git リポジトリのウィンドウに Commit の詳細とファイルの比較を含むことができます。
ファイルの削除数や挿入数を表示したり、比較のレイアウトを変更したりすることができます。
Git Changes ウィンドウからさらに多くのアクションを実行できるようになりました。ツールバーのアイコンはカスタマイズ可能で、表示するアクションを選ぶことができます。
オーバーフロー メニューには、同期、ブラウザで開く、ツールバーのアクションが表示されています。また、リポジトリのリモートウェブページをブラウザで開くことができます。
Azure DevOps の Git リポジトリを開く際に、自動的に再接続するか、初期の Azure DevOps 接続を確立するように促してくれます。これにより、開いたリポジトリのワークアイテムやビルドへのアクセスが可能になります。
リベースやマージのコンフリクトを解決する際、マージ エディタやコンテキスト メニューに Current ブランチと Incoming ブランチのブランチ名が表示されます。これにより、紛らわしいソースとターゲットの用語の問題が修正されます。やったね。
※ コンフリクト解決時のコンテキストメニューにブランチ名が表示されるようになりましたよ!
※ リベースとマージ エディタでは、見出しにブランチ名が表示されますよ。便利。
PR の作成や一覧ページへのショートカットとなるメニュー項目を追加し、プルリクエストの作成や閲覧を容易にしました。メニューは、リポジトリがGitHub あるいは Azure DevOps のどちらにあるかに応じて動的に変化します。
###Git の設定
Git > 設定 に、リポジトリのオープンや切り替えを管理するためのオプションがいくつか追加されました。別のリポジトリに切り替える際に、現在のソリューションを開いたままにできるようになりました。
また、リポジトリを開くときに、リポジトリのルートフォルダーを読み込まないようにすることもできます。この場合、ソリューションエクスプローラーは空のままで、ソリューションリストは表示されません。
しかし、ルートフォルダを開くことを選択した場合、Visual Studio は自動的にソリューションを読み込まなくなります。代わりに、フォルダビューとソリューションがリストに表示され、そこから選択できるようになります。この動作を変更するには、Git > Settings でチェックボックスをオンにします。下記は、ソリューション・エクスプローラーのオート・ナビゲーションを切り替える設定となります。
ブランチをチェックアウトするかどうかは、Git Repository ウィンドウでブランチ名をダブルクリックすることで選択できます。この動作を変更したい場合は、Git > Settings でチェックボックスを切り替えます。
設定では、自動 sln ロードとブランチ チェックアウトを切り替えます。
#パフォーマンス プロファイラ
パフォーマンス プロファイラの公開ページには、ツールの使用方法を説明したオンライン ドキュメントとツールボックス ビデオ シリーズへのリンクが追加されました。これらのリンクから、ツールの詳細や、コード内で最適化すべき領域を特定し、変更内容を検証する方法を学習いただけます。
パフォーマンス プロファイラの.NET Object Allocation ツールは、大幅に高速化し、より多くの機能を提供する新しい分析エンジンに移行したはじめてのツールです。情報収集後、プロファイル結果を得られるだけでなく、コールツリーをより速く構築することができます(約 40% の向上)。また、ソースを引き出すためのソース リンクもサポートしているので、コード内でなくても、コードがどこでアロケートしているかを正確に把握することができます。
なお、これには対応するコードのシンボルが必要ですが、これはマイクロソフトのシンボル サーバーから取得することができます。(対応には、オプション メニューの デバッグ > オプション > シンボル から有効化できます。下記参照)
###コンテナ―関連のサポート
Dockerコンテナツールのユーザーのために、いくつかのエキサイティングな機能が追加されました。コンポーズファイルで定義したサービスを自由に組み合わせて実行できるようになったほか、「Container」ウィンドウでコンテナやイメージの管理が改善されました。詳しくは、16.10プレビュー3ブログの「New Features for Containers」(リンク先英語)をご覧ください。
###.NET Productivity
.NET チームからは、生産性の継続的な向上に役立ついくつかの機能をお届けします。
まず、Remove Unused References コマンドによる機能追加です。このコマンドを使用すると、未使用のプロジェクト参照やNuGetパッケージをクリーンアップすることができます。このオプションはデフォルトではオフになっていますが、メニューの **[ツール] → [オプション] → [テキストエディタ] → [C#] → [詳細]**で有効にすることができます。ソリューション エクスプローラ(注 : 試験的対応)で Remove Unused References コマンドを選択します。このオプションを有効にすると、プロジェクト名や依存関係ノードの右クリックメニューに Remove Unused References コマンドが表示されます。
Remove Unused References を選択すると、ダイアログ ボックスが開きます。削除されるすべての参照を見ることができますが、残しておきたい参照を保存するオプションもあります。
#IntelliSense の補完
Enum の値が入力されていなくても、型がわかっている場合には、IntelliSense の補完機能が追加されます。
また、このオプションを拡張して、キャスト、インデクサ、および演算子の補完機能が追加されました。
また、メソッドコールを記述する際に引数を自動的に挿入する補完オプションも用意されました。
この機能は既定では無効です。[ツール] → [オプション] → [テキスト エディタ] → [C#] → [IntelliSense] で有効にし、[Tab] を 2 回選択して引数を挿入する必要があります(注 : 試験的対応)。
この機能を使用するには、メソッドの呼び出し記述で、タブ キーを 2 回押します(tab+tab)。このメソッド呼び出しには、メソッドの既定値に基づいた引数が含まれていることに注意してください。引数情報を使って、上下の矢印キーで挿入したい引数のリストを表示していきます。引数の入力を開始すると、IntelliSence の補完リストが表示されます。semicolon と入力すると、引数が確定され、メソッド呼び出しの最後にセミコロンが追加されます。
###継承チェーンの視覚化とナビゲーション
継承関係を視覚的に確認できるようになりました。なお、このオプションも既定では無効なので、[ツール] → [オプション] → [テキスト エディタ] → [C#] → [詳細] で [Show Inheritance margin] を選択して有効化する必要があります。継承マージンを有効にすると、コードの実装やオーバーライドを表す余白に新しいアイコンが追加されます。
継承マージンのアイコンをクリックすると、ナビゲート可能な継承オプションが表示されます。
###テスト エクスプローラのアクセシビリティの向上
テスト エクスプローラにいくつかのアップデートを行い、キーボードのアクセシビリティや、テストの詳細ペインやログファイルの操作性を改善しました。詳しくは、v16.10 Preview 3 ブログの「Test Experience Accessibility Improvements」をご覧ください。
###WinForms アップデート
Visual Studio 16.10 のために Behavior Service をリファクタリングしました。これにより、.NET Core、5、6 用の新しい WinForms デザイナのパフォーマンスが大幅に向上しました。また、複数のコントロールの選択、ドラッグ、ドロップに関する多くの問題を修正しました。
###XAML Tooling のアップデート
XAML UI の開発をより生産的にするために、既存機能の改善と新機能の追加を続けています。
###XAML デザイナーのクイックアクション
選択したコントロールに表示される "LightBulb(電球表示)" の後ろのポップアップ メニューを使って、コントロールのプロパティを素早く変更できるようになりました。
XAML デザイナーでコントロールを選択すると、LightBulb が表示されます。これをクリックすると、そのコントロールで最もよく使われるプロパティのリストが表示され、プロパティ エクスプローラーでプロパティを探したり、XAML エディタでコードを入力したりする手間が省けます。
サポートされているコントロール :
- WPF: Border, Button, Canvas, CheckBox, ComboBox, Grid, Image, Label, ListBox, ListView, StackPanel, TextBlock, TextBox.
- UWP: Border, Button, Canvas, CheckBox, ComboBox, Grid, HyperlinkButton, Image, ListBox, ListView, NavigationView, RadioButton, Slider, StackPanel, TextBlock, TextBox.
この機能は、UWP、WPF Core、および WPF Framework(「New WPF XAML Designer for .NET Framework」機能フラグを有効にした場合)で利用できます。独自のアクションを作成することもできます。詳しくは XAML Designer Extensibility GitHub (リンク先英語) をご覧ください。
###XAML サンプルデータ
通常、コントロールがデータ値でどのように見えるかを確認するには、すべてのデータ バインディングを実装し、データベースに値を入力して、アプリケーションを実行する必要があります。この機能を使えば、ダミーのデータでコントロールがどのように見えるかを、デザイナーですぐに確認することができます。ListBox、ListView または DataGrid にd:ItemSource='{d:SampleData}' を 設定してください。このコントロールには、DataTemplates と BindingPath に一致する ダミー データが自動的に入力されます。このデータはデザイナーに表示され、ソースコードには影響しません。
ItemCount プロパティを使用して、生成されるアイテムの数を変更することができます。例えば、d:ItemSource='{d:SampleData ItemCount=3}', デフォルトでは 5 に設定されています。
#Visual Studio 2019 v16.11 Preview 1 新機能
###.NET ホット リロード
WPF、Windows Forms、ASP.NET Core、Console などのアプリケーションのコードファイルを編集する際の新しいユーザー エクスペリエンス「Hot Reload」の提供を開始します。ホット リロードでは、アプリケーションの実行中にソースコードを変更することが可能であるため、わざわざ実行の一時停止やブレークポイントを使用する必要はありません。サポートされている変更を行い、ツールバーに新たに追加された「コード変更の適用」ボタンを使用するだけで、すぐに適用することができます。
今回の Visual Studio のアップデートでは、デバッガー (F5) でアプリケーションを実行しているときにこの新しい機能を利用できます。
この機能は、EnC (Edit and Continue) メカニズムによって動作します。
EnC がサポートされているところでは、ホット リロードを他のデバッガ機能と一緒に使用することができます。また、ホット リロードは XAML Hot Reload と一緒に動作するため、WPF や WinUI などのデスクトップ アプリケーションでも UI とコードビハインド部分の双方を変更することができます。
ただし、EnC とホット リロードには、双方に共通の制限があります。すべてのタイプの編集がサポートされているわけではありません。サポートされているもの、されていないものの完全なリストは、下記ドキュメントに記載されています。こちらから御覧ください。
ホット リロードは、.NET 6 Preview 3 以降の特定のシナリオにおいて、CLI ツール「dotnet watch」でも利用できるようになりました。詳細は、 .NET リリース ブログをご覧ください。
なお、デバッガ(CTRL-F5)を使わずにアプリケーションを起動する際にVisual Studio からホット リロードを使用する機能や、サポート対象の編集機能数を増やすことや、Razor ページの編集機能の有効化、Blazor および .NET MAUI アプリケーションでのホット リロードのサポートなど、今後対応を強化していく予定です。私たちのビジョンをさらに詳しく知りたい方は、.NET Blog をぜひご覧ください。また、実際にお手元のアプリケーションでホット リロードをお試しいただきましたら、Visual Studio のフィードバック機能を通じてご意見をお寄せいただければ幸いです。
###.NET MAUI
Visual Studio 16.11 Preview 1 より .NET MAUI サポートが追加されました。今年 11 月に GA 予定の .NET Multi-platform App UI (MAUI) は、iOS、Android、Windows、Mac OS 向けのクロス プラットフォーム アプリケーション開発に最適な方法といえるでしょう。
.NET 6 Preview 4では、単一プロジェクトの改善、サポートされているすべてのプラットフォームをターゲットにする機能、Blazor ハイブリッド デスクトップのサポートなど、新しい .NET MAUI の機能が追加されています。Visual Studio 16.11 Preview 1 では、IDE から .NET MAUI アプリケーションを開いてビルドし、デバッグすることが可能であり、また新しい単一プロジェクト アーキテクチャの機能が追加されました。
新しいプロジェクト構成ウィザードを使用して、.NET MAUI アプリを作成することができます。デモアプリ "WeatherTwentyOne" はこちらからお試しいただけます。
.NET MAUI と Visual Studio ならば、モバイルと、デスクトップをターゲットにするためにソリューション内に必要なプロジェクトは一つですみます。画像、フォント、アプリ情報、さらにはスプラッシュ スクリーンなどをすべて単一プロジェクトで定義し、コンパイル時に各プラットフォームにデプロイすることができます。
マルチ ターゲット機能を使えば、ターゲットのフレームワークごとにプロジェクトを管理することなく、サポートされているすべてのプラットフォームでデバッグを行うことができます。新しい .NET MAUI 単一プロジェクトのアーキテクチャについては、2021 年 5 月の Xamarin コミュニティの紹介(動画)をご覧ください。
.NET MAUI の単一プロジェクト アーキテクチャにより、1 つのプロジェクトから Android、iOS、Windows、および Mac OS をターゲットにすることができます。.NET MAUI を試すには、Visual Studio 16.11 をダウンロードし、.NET MAUI samples repo の指示に従って、.NET 6 Preview SDK をインストールしてください。
Visual Studio 2019 が提供する最新の機能を体験するには、今すぐプレビューをダウンロードしてください。問題の報告や Developer Community でのフィードバックもお待ちしています!
追記 : [日本語] Introducing the .NET Hot Reload experience for editing code at runtime も併せてご案内しました。
https://qiita.com/uikou/items/4022e31ca14bd90842bb