2021-09-03

Published on Friday, 03 September 2021

主なトピックス

今週は大きなリリースはなく、主に .NET 6 に向けた改善や API の紹介記事などが出てきています。

.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日に終了した旨のアナウンス。

Visual Studio 2022 for Mac version 17.0 Private Preview 1.3

https://docs.microsoft.com/en-us/visualstudio/releases/2022/mac-release-notes-preview#17.0.0-priv-pre.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

https://medium.com/@olivier.gaumond/investigation-of-an-openssl-cve-found-in-aspnet-5-0-image-2d66b03c9d53

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 句の中ではまだスタックの状態が維持されているため、そこで止めることで呼び出し元の状態を確認できるというテクニック。

image image

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

https://medium.com/@projectsbydan/authenticating-your-nextjs-app-to-a-net-api-with-auth0-d092747a6201

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

https://medium.com/@simonas.baltulionis/un-conventional-way-to-name-this-variable-in-extension-methods-68091f9f8b8b

拡張メソッドのターゲットとなる引数 (例: 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

https://ab.bot/

C#, Python, JavaScript で Hubot のような Slack, Discord, Teams 向けのチャットコマンドアプリを作れるサービス。

提供元の A Serious Business, Inc. は Phill Haack さんが創設者で CTO の会社。

ryzngard - Twitch

https://www.twitch.tv/ryzngard

Roslyn にコミットしているエンジニアの Andrew さんのコーディング配信。

ツイート

Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 3rd Edition の日本語訳版が10月上旬に発売予定。

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。

https://github.com/dotnet/runtime/pull/54253

.NET 6 Preview 4 でシンボリックリンクやジャンクションなどを取り扱えるようになる API が追加。

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。