主なトピックス
今週は大きなリリースはなく、主に .NET 6 に向けた改善や API の紹介記事などが出てきています。
- File IO improvements in .NET 6 | .NET Blog
- New .NET 6 APIs driven by the developer community | .NET Blog
.NETのクラスライブラリ設計の改訂新版が来月上旬に発売となります。
現在入手可能なものは原著の 2nd Edition をベースとしたものですでに12年が経過しており、今回の改訂新版は去年出版された 3rd Edition となり、async から Span<T>
などもカバーされているようです。
ヘッドライン
File IO improvements in .NET 6 | .NET Blog
https://devblogs.microsoft.com/dotnet/file-io-improvements-in-dotnet-6/
.NET 6 で FileStream を改善してパフォーマンスを改善した話。
スレッドセーフなオフセットベースでのアクセスを可能とする RandomAccess
クラスの追加。PreallocationSize
による事前に必要なサイズを渡すオプションの追加により、あらかじめ必要なサイズを OS に通知できるように。複数のバッファを読み書きする Scatter-Gather IO (ベクタ IO) をサポートする API の追加で scatter/gather パターンでのシステムコールを減らしパフォーマンスを向上できるように。
挙動に破壊的変更が若干あるため、.NET 5 と同様の挙動にするオプションの設定方法についても説明 (.NET 7 で削除予定)。
New .NET 6 APIs driven by the developer community | .NET Blog
https://devblogs.microsoft.com/dotnet/new-dotnet-6-apis-driven-by-the-developer-community/
.NET 6 で追加や使いやすくなった API の紹介。
- ファイルのランダムアクセスの API
- Environment.ProcessId/ProcessPath
- CSPNG から手軽にランダムバイト列の取得
- Parallel.ForEachAsync の追加
- LINQ の Chunk, MinBy/MaxBy の追加
- ConfigurationHelper での必須項目の取得方法の追加
- 2の乗数かどうかをチェックする BitOperations.IsPow2 と一番近い値にする BitOperations.RoundUpToPowerOf2 の追加
- Task の待機にタイムアウトを指定できる WaitAsync(TimeSpan) の追加
- ArgumentNullException を簡単にスローする ArgumentNullException.ThrowIfNull の追加
- ネイティブメモリーを扱う NativeMemory クラスの追加
- POSIX シグナルハンドリング
- OpenTelemetry API の形をベースとした Metrics API の追加
- await を使用する形のモダンなタイマーの追加
Introducing the .NET MAUI Community Toolkit (Preview) | .NET Blog
https://devblogs.microsoft.com/dotnet/introducing-the-net-maui-community-toolkit-preview/
.NET MAUI Community Toolkit のプレビューリリースとスケジュールについて。また、同時に Xamarin Community Toolkit の互換インターフェースを提供するライブラリも公開。
Windows Terminal Preview 1.11 Release | Windows Command Line
https://devblogs.microsoft.com/commandline/windows-terminal-preview-1-11-release/
Windows Terminal Preview 1.11 がリリース。
タイトルバーのアクリルスタイル、システムトレイへの最小化、強調テキストのスタイル、+ボタンへのドラッグアンドドロップ、ペイン関連の強化など。
ReSharper 2021.2.1 and Rider 2021.2.1 Bug Fixes Are Out!
https://blog.jetbrains.com/dotnet/2021/08/27/resharper-rider-2021-2-1/
Rider 2021.2.1 と ReSharper 2021.2.1 のリリース。主にバグフィックス。
G2: gRPC over HTTP/3 by JamesNK · Pull Request #256 · grpc/proposal
https://github.com/grpc/proposal/pull/256
gRPC over HTTP/3 の提案。エラーコードのマッピングや HTTP/2 とは異なる部分の対応。
.NET Core 2.0/2.1 has reached end of life
.NET Core 2.0 と 2.1 のサポートが8月21日に終了した旨のアナウンス。
- .NET Core 2.1 has reached end of life · Issue #199 · dotnet/announcements
- .NET Core 2.0 has reached end of life · Issue #86 · dotnet/announcements
Visual Studio 2022 for Mac version 17.0 Private Preview 1.3
Visual Studio 2022 for Mac version 17.0 Private Preview 1.3 がリリース。
主にバグフィックスを含むリリース。現在プライベートプレビュー中のためフォームでの申し込みが必要。
アーティクル、スライドなど
IntelliSense for Hosted C# Script
http://haacked.com/archive/2021/09/01/hosted-csharp-intellisense/
C# スクリプトの IntelliSense を実現するための MirrorSharp や OmniSharp の紹介。
Investigation of an OpenSSL CVE found in aspnet:5.0 image
OpenSSL CVE が発行され、.NET 5 の ASP.NET Core のコンテナーイメージを脆弱性スキャンで検出される話。
これは Debian のベースイメージは更新されたがその後に .NET のイメージが再ビルドされていないため検出される。バージョンの固定による把握や脆弱性スキャンの重要性。
The .NET Team's Favorite Razor Features
https://dev.to/dotnet/the-net-team-s-favorite-razor-features-5b72
.NET チームがおすすめする Razor の機能 (主に ASP.NET Core のビューとしての Razor)。タグヘルパー, @await
, @inject
, @:
, 各種ライブラリーなど。
A neat Trick to Debug Exceptions in C#
https://www.rismosch.com/article?id=a-neat-trick-to-debug-exceptions-in-c-sharp
例外デバッグのちょっとしたテクニックの紹介。catch 句ではすでにスタックトレースが巻き戻った状態になるが、when 句の中ではまだスタックの状態が維持されているため、そこで止めることで呼び出し元の状態を確認できるというテクニック。
Optimization of .NET applications: a big result of small edits
https://pvs-studio.com/en/blog/posts/csharp/0852/
.NET Framework アプリケーションに関する最適化のポイントについて (.NET/.NET Core ではなく .NET Framework の話であることに注意)。
Blazor WebAssemblyのAOTコンパイルでクライアントサイドの画像処理を高速化
https://zenn.dev/kaorumori/articles/1aa45e5ec256c1
.NET 6 Preview 4 で導入された Blazor WebAssemly の AOT コンパイルを使用することで処理を高速化することについて。
コンパイルには時間がかかるがImageSharp のような処理内容次第では大きな効果が見込める実例など。
Authenticating your NextJs App to a .net API with Auth0
ASP.NET Core で実装された API 呼び出す Next.js アプリを Auth0 で認証する方法について。
Firebase Authentication .NET 5
https://dev.to/ivan_pesenti/firebase-authentication-net-5-29oi
ASP.NET Core アプリケーションで Firebase Authentication を使用する手順について。
Add a README to Your NuGet Package | The NuGet Blog
https://devblogs.microsoft.com/nuget/add-a-readme-to-your-nuget-package/
NuGet パッケージに README ファイルを含めてパブリッシュすることで NuGet.org のパッケージページ上に表示する方法について。ただし、現状 .NET 6 Preview の SDK では snupkg を生成するようにするとエラーとなる問題がある点に注意。
(Un)Conventional way to name this
variable in extension methods
拡張メソッドのターゲットとなる引数 (例: this string value
) の名前に this
という名前を使えてしまうという話と、それを名前付き引数で呼び出すときに Unicode エスケープできるという話。
.NET Annotated Monthly | September 2021 | The .NET Tools Blog
https://blog.jetbrains.com/dotnet/2021/09/02/net-annotated-monthly-september-2021/
JetBrains による .NET 関連のまとめ9月号
ライブラリ、リポジトリ、ツールなど
Cysharp/ObservableCollections: High performance observable collections and synchronized views, for WPF, Blazor, Unity.
https://github.com/Cysharp/ObservableCollections
WPF, Blazor, Unity 向けの変更通知を受けられるコレクションを提供するライブラリ。
ObservableCollection<T>
とは異なりあらかじめソートされた結果のビューなどを定義しておくことで表示に反映していくということができる。
WireMock-Net/WireMock.Net: WireMock.Net is a flexible library for stubbing and mocking web HTTP responses using request matching and response templating. Based on the functionality from WireMock.org, but extended with more functionality.
https://github.com/WireMock-Net/WireMock.Net
モック API サーバーを実装する WireMock の .NET 実装。
設定で単純な返しを行うモックサーバーからプロキシや、コードベースでふるまいを定義できる。
dirs-dev/directories-net: Directories.Net
https://github.com/dirs-dev/directories-net
プラットフォームを抽象化してドキュメントフォルダーのようなものを取得するライブラリの .NET 実装。
Windows は Known Folder API、macOS は Standard Directories 定義、Linux では xdg-user-dirs を使用する。
GitHub - dotnet/runtimelab at feature/regexsrm
https://github.com/dotnet/runtimelab/tree/feature/regexsrm
runtimelab の Symbolic Regex Matcher の実装ブランチ。
サイト、ドキュメントなど
Quiz - Evaluate you .NET memory management skills
https://quiz.dotnetmemoryexpert.com/
.NET の GC やメモリの扱いに関するクイズ。
Abbot: Make Chat Your Command Center
C#, Python, JavaScript で Hubot のような Slack, Discord, Teams 向けのチャットコマンドアプリを作れるサービス。
提供元の A Serious Business, Inc. は Phill Haack さんが創設者で CTO の会社。
ryzngard - Twitch
https://www.twitch.tv/ryzngard
Roslyn にコミットしているエンジニアの Andrew さんのコーディング配信。
ツイート
『.NETのクラスライブラリ設計 改訂新版』、来月上旬発売予定です。
— FUJIWARA, Yusuke (@yfakariya) September 2, 2021
非互換の考え方などの付録も完全収録、コンテンツの追加等諸々で前の版の1.5倍超のボリューム、豪華監訳陣を加え訳文の質も上がってます!
C# 書かない人もライブラリ設計の参考になるかも。
電子版もリフロー形式で発売予定です。 pic.twitter.com/hCTGTNFoc5
Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 3rd Edition の日本語訳版が10月上旬に発売予定。
Unity 2021.1.19f1 で C# 8.0 の await using 使うとコンパイルエラー(CS0518)が起きる件について、「ランボー 怒りの Bug Reports」をキメたので、再現プロジェクト置いておきますね。https://t.co/LKUvz0cwGV
— もんりぃ先生 (@monry) September 2, 2021
Unity 2021.1 では C# 8 が使えるようになっているが、C# 8 の公式サポートは .NET Standard 2.1 または .NET Core 3.x 以降となっているギャップにより await using
を使ったコードで問題が出るという話。IAsyncDisposable
がないためでダミーの型を追加するか .NET Standard 2.1 をサポートする Unity 2021.2.0b6 以降を使う。
Deep Dive
Consider returning a generic Dictionary
from Environment.GetEnvironmentVariables
. · Issue #58438 · dotnet/runtime
https://github.com/dotnet/runtime/issues/58438
Environment.GetEnvironmentVariables がジェネリックな Dictionary を返してほしいという話。
Hashtable そのものや yield する際に DictionaryEntry が返ってくることを期待している既存コードが多く、過去に断念している話など。
[API Proposal]: Make StringBuilder.AppendSpanFormattable · Issue #58459 · dotnet/runtime · GitHub
https://github.com/dotnet/runtime/issues/58459
StringBuilder に ISpanFormattable を受ける API が欲しいという提案。
Use IndexOf to find value for smaller enums by stephentoub · Pull Request #57973 · dotnet/runtime
https://github.com/dotnet/runtime/pull/57973
Enum の文字列キャッシュなどを今まではバイナリサーチしていたが、数が少ない場合はリニアに探すほうが速いという PR。
Add symbolic link APIs by carlossanlop · Pull Request #54253 · dotnet/runtime
https://github.com/dotnet/runtime/pull/54253
.NET 6 Preview 4 でシンボリックリンクやジャンクションなどを取り扱えるようになる API が追加。
- FileSystemInfo.ResolveLinkTarget(Boolean) Method (System.IO) | Microsoft Docs
- Proposed API for symbolic links · Issue #24271 · dotnet/runtime
- Add internal junction support to link APIs by carlossanlop · Pull Request #57996 · dotnet/runtime
Higher Level SyntaxProvider APIs for incremental generators · Issue #54725 · dotnet/roslyn
https://github.com/dotnet/roslyn/issues/54725
Remove usage of [AggressiveOptimization] by steveharter · Pull Request #58209 · dotnet/runtime
https://github.com/dotnet/runtime/pull/58209
System.Text.Json から4か所の AggressiveOptimization を外した PR。
2か所はループを持つため AO の効果がなく、残りの2つは非 R2R (Ready-to-Run) 環境の Release ビルドでのみ効果があり R2R では元々 AO 相当の効果がある、また AO を外すことで Dynamic PGO モード をサポートできるといった利点がある。
ローカルの Release ビルドで…と書かれているので、通常配布されている .NET ランタイムの In-box ライブラリは各プラットフォーム向けで R2R 済みと思われる。
Dynamic PGO は .NET 6 で導入された実行時にプロファイリングして最適化をかけるオプトイン機能(なので "best perf but slow start" / 開始は遅いが最高のパフォーマンス)。
Add Win11 RIDs by vitek-karas · Pull Request #58588 · dotnet/runtime · GitHub
https://github.com/dotnet/runtime/pull/58588
Windows 11 向けの Runtime Identifier (RID) の追加。
Use lambda expression and method group signature in type inference by cston · Pull Request #55786 · dotnet/roslyn
https://github.com/dotnet/roslyn/pull/55786
ラムダ式の型推論の強化に関する PR がマージされた。
Support generic array parameters in components by campersau · Pull Request #34734 · dotnet/aspnetcore · GitHub
https://github.com/dotnet/aspnetcore/pull/34734
型パラメーターを受けるような Blazor のコンポーネントで配列を使えなかった問題の修正 PR。
Adds Tizen backend by rookiejava · Pull Request #2360 · dotnet/maui
https://github.com/dotnet/maui/pull/2360
MAUI への Tizen のバックエンド追加の PR。