Visual Studio 2022 version 17.0 RC2 and Preview 6 がリリースされました。
.NET 自体の更新はなく Visual Studio のバグ修正が主な更新点です。何か不具合のようなものを踏んでいる方は更新をおすすめします。
LINQPad 7 Beta がリリースされました。
.NET 6 および C# 10 に対応し、ARM64 向けのバイナリーも含まれるようになりました。Surface Pro X のような ARM 版 Windows でも C# を書いて ARM ネイティブで動かせるようになりました。現在 6 のライセンスは無償アップグレードとなっていて、既にライセンスを持っている人でも割引で購入できるようになっています。
ホットリロードについてのステータスアップデートがアナウンスされました。
アナウンスでは Visual Studio とターゲットフレームワークによる対応具合や MAUI/ASP.NET での対応についても書かれていますが、地味に大きな点としては dotnet watch
をリリースしないという決定がなされたという点です。特に Visual Studio を使用していない開発者がホットリロードの恩恵を受けられなくなるということで大きな反響が生まれています。
元々バギーではあったのですが .NET 6 の目玉機能かつ RC2 をリリースした後、GA までもう少しという直前の段階で削除をしてリリースしないというアナウンスをしたので余計に不満になっていそうです。今後何らかの形で戻されたりする可能性は十分あるのではないかと思います。
トピックス
Visual Studio 2022 version 17.0 RC2 and Preview 6
Visual Studio 2022 version 17.0 RC2 と Preview 6 がリリースされた。
RC と Preview 5 のリリースからの Visual Studio 固有のバグ修正が行われており、.NET 6 SDK などへの変更はない。
LINQPad 7 Beta
https://www.linqpad.net/LINQPad7.aspx
LINQPad 7 Beta がリリースされた。
LINQPad 7 は .NET 6 および C# 10 に対応したリリースとなり、.NET 6, .NET 5, .NET Core 3.1, .NET Framework をサポートする。 また ARM64 ビルドも提供され Surface Pro X をはじめとする ARM64 環境でのネイティブ動作が可能となった。
正式なリリースは .NET 6 のリリース後となり、現在 LINQPad 6 のライセンスを購入することでリリース時にアップグレードが可能。
LINQPad 7 Preview has just been released, with full support for C# 10, @dotnet 6 and EF Core 6. There's also now an ARM64 build, so you can run and debug C# and F# code on your Surface Pro X at native speed!https://t.co/1sC2iOFwoW
— LINQPad·Joe Albahari (@linqpad) October 18, 2021
Update on .NET Hot Reload progress and Visual Studio 2022 Highlights
.NET のホットリロードについてのアップデートの記事。
記事では次のようなトピックについて書かれている。
- サポートされるフレームワークとシナリオ
- Visual Studio 2022 での体験の向上
- MAUI と ASP.NET でのシナリオ
- .NET アプリの編集に関する追加サポート
- .NET 6 ユニットテストのホットリロード (Experimental)
dotnet watch
コマンドラインツールに関する変更
サポートされるフレームワークとシナリオについては Visual Studio 2022 からデバッガーを使用しているかそうでないか、Visual Studio 2022 と .NET 6 をターゲットとしたアプリかどうかといった場合について書かれている。大まかには従来のフレームワークをターゲットとしている場合にはデバッグ時のみ、.NET 6 をターゲットとしている場合はデバッガーなしも含め殆どのケースでサポートされる。
ただし Blazor WebAssembly は GA の時点では対応されず、他に対応しないシナリオとして iOS と Android の Xamarin.Forms や F# アプリケーション、.NET Native アプリケーションなどがあるとのこと。
Visual Studio 2022 での体験の向上は、ラベルが Hot Reload となったこと、ファイル保存時にホットリロードする機能が付いたことなどがあげられている。
MAUI と ASP.NET でのシナリオは MAUI (iOS/Android) でのホットリロードが可能になること、ASP.NET では Razor CSHTML の変更と自動リロード、CSS のホットリロードなどが可能となった。ただし MAUI のホットリロードは Mono ランタイムの制限上メソッドボディーの編集に限られるとのこと。
その他 XAML のホットリロードとユニットテスト実行時のホットリロードがプレビュー(オプトイン)で提供されていることについて。
最後に dotnet watch
コマンドラインツールについて、ホットリロードは開発の集中のため Visual Studio 2022 でのみの提供となり、コマンドラインツールはリリースしないと決定したとのこと。Visual Studio 2022 for Mac に関しては将来のリリースで追加する予定。
これに伴い dotnet watch
が削除されたが、Visual Studio Code や Rider といった Visual Studio 以外のユーザーからは不満の声が上がっているので今後何らか動きがある可能性がある。
- Remove Hot Reload support from dotnet watch by pranavkm · Pull Request #22217 · dotnet/sdk
- Hot Reload removed from dotnet watch - Why? · Issue #22247 · dotnet/sdk
What’s new in F# 6
https://devblogs.microsoft.com/dotnet/whats-new-in-fsharp-6/
.NET 6 に含まれる F# 6 についての記事。
F# で速くなった点、均一化された点、シンプルになった点、ツーリングの改善などについて触れている。
Introducing new JavaScript Engine YantraJS for DotNet
https://www.webatoms.in/blog/yantra-js/Introducing-new-JavaScript-Engine-YantraJS-for-DotNet-2g
オープンソースの JavaScript エンジンの YantraJS がリリースされた。
.NET との相互運用や JavaScript を .NET のアセンブリーに変換するコンパイラーなどが提供されることが特徴。 現時点で ECMAScript 6 の適合率は70%程度で今後100%を目指すとのこと。その他 V8 Debugger Protocol のサポートなどが今後のロードマップにあがっている。
ライセンスは LGPL、YantraJS Standard License (主にサーバーサイド利用目的)、YantraJS Enterprise License となっている。MIT ライセンスに変更できるようスポンサーも求めているとのこと。(ただ LGPL 版を NuGet で参照した場合でもソースコードを公開する必要があると書かれているので LGPL ではない可能性がある)
We've upgraded the UI in Visual Studio 2022
https://devblogs.microsoft.com/visualstudio/weve-upgraded-the-ui-in-visual-studio-2022/
Visual Studio 2022 における UI の変更についての記事。
一貫性や視認性、親しみやすさを考慮したアイコンの刷新、ダークモードでのコントラスト調整や新しいアクセントカラー、Cascadia フォントの導入などについて触れている。
Contributing to .NET MAUI Community Toolkit
https://devblogs.microsoft.com/dotnet/contributing-to-net-maui-community-toolkit/
.NET MAUI Community Toolkit にコントリビュートする方法についての記事。
.NET MAUI Community Toolkit がコミュニティーのコントリビュートを受け入れるようになり、新機能を提案したい場合のフローについて解説している。 フローは C# チームのものを参考にしたものとなっている。
- Discussion をオープン
- フィーチャーの Proposal (Issue) をオープン
- チームによって Champion を選出
- .NET MAUI Community Toolkit Monthly Standup (YouTube 配信) で投票の上、承認
- Pull Request 承認
- ドキュメント承認
承認された Proposal は help wanted
ラベルがつけられるため、簡単なコントリビュートとしてはこの実装を提供する(Pull Request)という方法も提示されている。
Release 2.0.0-beta.5 · mysql-net/MySqlConnector
https://github.com/mysql-net/MySqlConnector/releases/tag/2.0.0-beta.5
Async MySQL Connector 2.0.0-beta.5 がリリースされた。
変更点は ActivitySource
によるトレースへの対応。今回のリリースよりバージョニングが 1.4.0 ベータでの変更範囲を鑑みて 2.0 へと変更された。
Release 1.3.14 · mysql-net/MySqlConnector
https://github.com/mysql-net/MySqlConnector/releases/tag/1.3.14
Async MySQL Connector 1.3.14 がリリースされた。
バグ修正が主な変更となっている。
Release EF Core 3.1.20 · dotnet/efcore
https://github.com/dotnet/efcore/releases/tag/v3.1.20
Entity Framework Core 3.1.20 がリリースされた。
SQLite の不具合対応に伴い、依存しているバージョンが 2.0.2 から 2.0.4 へアップデートされた。
Release Diagnostics Release - v5.0.251802 · dotnet/diagnostics
https://github.com/dotnet/diagnostics/releases/tag/v5.0.251802
.NET の診断ツール 5.0.251802 がリリースされた。
dotnet-dump
と dotnet-sos
は Linux と Windows 上でのシングルファイルアプリケーションのプロセスとファイルの解析がサポートされた。その他バグ修正など。
Developing for Windows with the Windows App SDK · Discussion #1615 · microsoft/WindowsAppSDK
https://github.com/microsoft/WindowsAppSDK/discussions/1615
Windows App SDK と WinUI 3 の開発についての FAQ。
今後 UWP はバグや信頼性に関連する修正のみが行われ、Windows App SDK を使用する場合には新しいデスクトッププロジェクトに移行する必要があること、といった点など。
.NET Framework October 2021 Security and Quality Rollup
https://devblogs.microsoft.com/dotnet/net-framework-october-2021-security-and-quality-rollup/
.NET Framework の2021年10月のセキュリティーと累積アップデートについて。
セキュリティーに関する更新はなく、正しくない GC の設定によるパフォーマンスの低下や GC.AddMemoryPressure での GC トリガーのアルゴリズムの調整などが含まれている。
BouncyCastle C# 1.9.0
https://www.bouncycastle.org/csharp/index.html#DOWNLOAD1900
BouncyCastle C# 1.9.0 がリリースされた。
TLS API の更新や Format Preserving Encryption、ParallelHash と TupleHash、ARIA cipher のサポートが追加された。バグ修正も行われている。
アーティクル、スライドなど
.NET 6 で追加されるタスクベースの新しいタイマー - Qiita
https://qiita.com/karuakun/items/677b2e58260634d86d0d
.NET 6 で追加されたタスクベースとなる新しいタイマーの使い方とそれ以前のタイマーについての記事。
Unity - Improving iteration time on C# script changes
https://forum.unity.com/threads/improving-iteration-time-on-c-script-changes.1184446/
Unity で C# コードを変更したときのドメインリロードの時間が長くなってしまった件についての調査と進捗報告。
リグレッションは 2020.x から発生し、メトリクスの不足や問題が多岐にわたっていること、幾つかの側面から解決を図っていることなど。
例えば 2020.1 以降ではドメインリロードの診断メトリクスを保存する機能が追加されたので利用者が調べることができるようになった。コードベース全体を通してリグレッションを探すタスクフォースを立ち上げ細かく最適化を行うことなど。今後も継続して改善を進め、必要なものはバックポートし、その進捗はスレッドに報告するとのこと。
5 helpful Nuget package for Unit Testing in .NET
https://medium.com/@niteshsinghal85/5-helpful-nuget-package-for-unit-testing-in-net-87c2e087c6d
ユニットテストをするときに役に立つ5つの NuGet パッケージの紹介の記事。
Supporting integration tests with WebApplicationFactory in .NET 6: Exploring .NET Core 6 - Part 6
.NET 6 の ASP.NET Core を WebApplicationFactory を使用して統合テストを行うことについての記事。
WebApplicationFactory が内部で行っている処理についても解説している。
Updated Debugging Experience, UWP Apps, and Debug Windows Docker containers in Rider 2021.3 | The .NET Tools Blog
Rider 2021.3 で改善されたデバッグ周りについての記事。
デバッガーの UI の改善や UWP アプリと Windows Docker コンテナーの対応についてなど。
Bite-Size .NET 6 - LINQ OrDefault() Overloads
https://exceptionnotfound.net/bite-size-dotnet-6-linq-ordefault-overloads/
.NET 6 の LINQ の FirstOrDefault
のような *OrDefault
メソッドにデフォルト値を受けるオーパーロードが追加されたことについての記事。
var name = names.FirstOrDefault("Unknown"); // 見つからなかったら Unknown が返る
Exploring the Auth0 ASP.NET Core Authentication SDK
https://auth0.com/blog/exploring-auth0-aspnet-core-authentication-sdk/
アプリケーションで Auth0 の ASP.NET Core Authentication SDK を使用することについての記事。
gRPC API Performance Improvement Through Protobuf FieldMask In .NET
Protobuf の FieldMask を使用することで gRPC の API パフォーマンスを向上させることについての記事。
必要なフィールドだけを明示して取得することでサーバー側の不要な処理を回避して、メッセージサイズも削減できるというテクニック。
- Practical API Design at Netflix, Part 1: Using Protobuf FieldMask
- Netflixにおける実用的なAPI設計: gRPCとFieldMask | pyspa
Implement a secure API and a Blazor app in the same ASP.NET Core project with Azure AD authentication
Blazor WebAssembly と ASP.NET Core Web API に Azure AD 認証を実装する方法についての記事。
Asp Net Core - Rest API Authorization with JWT (Roles Vs Claims Vs Policy) - Step by Step
REST API に JWT を使った認可を実装する方法についての記事。
ライブラリ、リポジトリ、ツールなど
davidfowl/IISCrossover: A prototype running ASP.NET and ASP.NET Core in the same IIS pipeline
https://github.com/davidfowl/IISCrossover
IIS で ASP.NET アプリケーション (.NET Framework) と ASP.NET Core アプリケーションを同居させて同じパイプラインで動かすという仕組みのプロトタイプ。
If you're interested in trying it out and looking at the s/hacks/changes, the the repository is here https://t.co/masxtR85CC
— David Fowler 🇧🇧🇺🇸💉💉 (@davidfowl) October 16, 2021
devlooped/ThisAssembly: Exposes project and assembly level information as constants in the ThisAssembly class using source generators powered by Roslyn.
https://github.com/devlooped/ThisAssembly
自身のプロジェクトやアセンブリの情報を取得できるコードを生成する Source Generator。
Console.WriteLine(ThisAssembly.Info.Company); // AssemblyCompanyAttribute
アセンブリの情報だけでなく、定数の定義やメタデータ、プロジェクトのプロパティーにアクセスできるようなものも提供されている。
amis92/csharp-source-generators: A list of C# Source Generators (not necessarily awesome) and associated resources: articles, talks, demos.
https://github.com/amis92/csharp-source-generators
C# Source Generator のまとめリポジトリ。
サイト、ドキュメントなど
Windows Subsystem for Android™️
https://docs.microsoft.com/en-us/windows/android/wsa/
Windows Subsystem for Android™️ の開発者ドキュメント。考慮すべき点やアプリケーションのデバッグ方法などについて触れている。
Overall migration strategy - Windows apps
Universal Windows Platform から Windows App SDK へのマイグレーションのガイドドキュメント。
ツイート
It is amazing how @VisualStudio can show a deadlock in the async code in the 'Parallel Stacks' view!
— Sergey Teplyakov (@STeplyakov) October 15, 2021
It's not possible to figure out an issue like this one simply by looking into the stack traces. You need to look at how the async machinery is linked together to show it. pic.twitter.com/9WlANzaI5t
非同期処理のデッドロックの発見に Parallel Stacks ビューが便利という話(これは以前のバージョンの Visual Studio にある)。
In .NET 6, you can easily generate a random sequence of values from a Cryptographically Secure Pseudorandom Number Generator (CSPNG).
— Oleg Kyrylchuk (@okyrylchuk) October 15, 2021
It's useful for cryptographic applications for:
• key generation
• nonces
• salts in certain signature schemes#dotnet6 #coding #devcommunity pic.twitter.com/O1AmnBVTVE
.NET 6 では暗号論的擬似乱数生成器 (CSPRNG) を使用してランダムなデータを生成するのが RandomNumberGenerator
クラスの静的メソッドで簡単に取得できるようになったという話。
Thrilled to announce we have formed a C#/.NET Tech Group within Unity, bringing Scripting (C# compilation, .NET Runtime integration...), Burst & VM/IL2CPP teams all together to further standardize, modernize, and innovate with .NET technologies within the Unity platform! ♥️
— Alexandre Mutel (@xoofx) October 15, 2021
Unity 社で C#/.NET の技術グループが立ち上がってスクリプティング (C# や .NET ランタイムの統合)、Burst と VM/IL2CPP チームがまとまって Unity における .NET 技術の推進をしていくという話。今後 exciting news
があるとのこと。
One of my slides from the https://t.co/4PmXMQN7SX Core performance talk #dotnet #aspnetcore pic.twitter.com/kfkYo2uKM9
— David Fowler 🇧🇧🇺🇸💉💉 (@davidfowl) October 21, 2021
ASP.NET Core の .NET 6 まででどのぐらいパフォーマンスが改善されたのかという話のスライドからの抜粋。WebSocket のアロケーションやリクエスト/TLS ハンドシェイクでのアロケーション、ヘッダー周りの高速化などについて。
Deep Dive
DateTime.Now
on Linux has wrong timezone · Issue #60469 · dotnet/runtime
https://github.com/dotnet/runtime/issues/60469
DateTime.Now
が Linux で正しいタイムゾーンを返さないようだという Issue。クローズされているが self-contained な物で発生しているという報告。
Where is the ASP.NET Branding and Logo? · Issue #37550 · dotnet/aspnetcore
https://github.com/dotnet/aspnetcore/issues/37550
ASP.NET のブランディングロゴはどこにあるのかという Issue。
現時点では個別のロゴは存在しないがあってもいいのではないかとか、ブランディングのガイドラインではアプリモデルの形では例があり、今後更新していくといった話も。
Experiment with Unsafe.StackAlloc<T> by stephentoub · Pull Request #60428 · dotnet/runtime
https://github.com/dotnet/runtime/pull/60428
Hackathon で実装されたスタック上に T
の Span<T>
を作れる Unsafe.StackAlloc<T>
のサンプル利用例の PR。
この PR で見られるように現在の dotnet/runtime では Span<参照型>
をスタック上に作成するために次のようなテクニックを使っている。
ThreeMyClasses tmp = default;
Span<MyClass> threeMyClasses = MemoryMarshal.CreateSpan(ref tmp._value1, 3);
ref struct ThreeMyClasses
{
internal MyClass _value1;
private MyClass _value2;
private MyClass _value3;
}
class MyClass { }
これによりスタック上の構造体を Span<T>
に見せかけることで参照型を含む配列的なものをアロケーションなしで作ることができる。ただし、stackalloc
と異なりコンパイラーがコードをチェックできず return
できてしまう危険性がある点に注意。
[Proposal]: ReadOnlySpan initialization from static data · Issue #5295 · dotnet/csharplang
https://github.com/dotnet/csharplang/issues/5295
private static ReadOnlySpan<byte> Bytes => new byte[] { ... };
のような最適化テクニックがあるが、一部のプリミティブでのみ使用できるものでそれ以外のケースでは罠となってしまうのでそれ用の構文が欲しいという提案。
Update docs for PipeReader.TryRead by waf · Pull Request #52237 · dotnet/runtime
https://github.com/dotnet/runtime/pull/52237
Stream
を元にした PipeReader.TryRead
は Stream
に対して読み込みを実行しないということをドキュメントに明記するという PR。