Paint.NET 4.3 がリリースされました。
.NET 5 への移行が完了し、パフォーマンスの向上や ARM64 対応などが行われました。5か月かかったそうですが比較的歴史のある有名な .NET アプリケーションが .NET Framework から .NET 5 へ移行しきった例という点はとても大きいのではないでしょうか。
Visual Studio 2022 for Mac version 17.0 Private Preview 1.4 がリリースされました。
.NET 6 RC1 に対応し、Roslyn も Visual Studio 2022 (Windows) と同じバージョンに揃うことで C# 10 のコードも問題なく取り扱えるようになっています。また Xamarin プロジェクトの対応など一旦欠けていた機能が徐々に実装されてきているという状況です。
Package Validation についての記事が .NET Blog に出ています。
これはパッケージビルド時に API の互換性をチェックする仕組みを提供するものです。マルチターゲットなライブラリでのバイナリ互換性やパッケージバージョン間の互換性保てるよう、安全に開発するのに役立つと考えられます。
SourceGear Bridge preview: Swift with .NET in Xcode という Swift と .NET を合体して動かして Xcode でコードを書けるようにする野心的なパッケージ/SDKのプレビューが公開されています。
Eric Sink さんは元々 LLVM-to-CIL で Swift を .NET で動かすといったこともやっているのですが、今回のこれは .NET のアプリケーションが Swift のネイティブライブラリーをホストし、.NET のコードを呼び出せるバインディングを用意することで Swift から .NET のコードを呼び出すという仕組みのようです。
トピックス
paint.net 4.3 is now available – paint.net blog
https://blog.getpaint.net/2021/09/22/paint-net-4-3-is-now-available/
Paint.NET 4.3 がリリース。
5か月に及ぶ .NET Framework 4.8 から .NET 5 へ移行作業が完了。これによりパフォーマンスの向上、Self-contained 配布による .NET Framework インストールの不要化、ReadyToRun によるインストール時の NGEN ステップの不要化、ARM64 対応などの恩恵を受けられるようになった。
今後 .NET 6 がリリースされ次第そちらへの移行していくとのこと。
Visual Studio 2022 for Mac v17.0 Preview - Release Notes | Microsoft Docs
Visual Studio 2022 for Mac version 17.0 Private Preview 1.4 がリリース。(プライベートプレビュー中のため利用するには登録が必要)
.NET 6 RC1 の対応、Roslyn 4.0 への更新と C# 10 対応、Xamarin プロジェクトの対応など。その他プロジェクト設定などの IDE の未実装な部分の実装や改善。
Package Validation - .NET Blog
https://devblogs.microsoft.com/dotnet/package-validation/
.NET 6 の SDK で使用できるようになった Package Validation という MSBuild SDK パッケージについて。
Package Validation は次のようなパッケージビルド時の API 互換性チェックの仕組みを提供する。
- マルチターゲットでの互換性
- ベースライン間のパッケージの互換性
- ランタイム間の互換性
マルチターゲットでの互換性のチェックは例えば .NET Standard 2.0 と .NET 6 をターゲットにしたライブラリで API のバイナリ互換性が壊れてしまう例がある。記事では次のようなコードが例としてあげられている。
#if NET6_0_OR_GREATER
public void DoStringManipulation(ReadOnlySpan<char> input)
{
// use spans to do string operations.
}
#else
public void DoStringManipulation(string input)
{
// Do some string operations.
}
#endif
元々 .NET Standard 2.0 で参照されていた場合 DoStringManipulation(string input)
を使用できるが、.NET 6 以降の環境に移った場合は DoStringManipulation(ReadOnlySpan<char> input)
のみが使用できる状態となるため DoStringManipulation(string input)
がないというエラーとなる。ソースコードレベルでの互換性はあるので再コンパイルすれば再び正しく動作するが自身のコードでない場合は難しいといったことが発生する。これは DoStringManipulation(string input)
が NET6_0_OR_GREATER
でも残っていれば問題とならない。このようなコードを検出してパッケージのビルドエラーとする。
ベースライン間のパッケージの互換性チェックは指定した NuGet パッケージバージョンを API のベースラインとしてバイナリ互換性をチェックする仕組み。
ランタイム間の互換性チェックは Unix や Windows のようなランタイム固有で持つ API が異なる場合、固有のランタイムをターゲットとした場合に互換性のある API があるかどうかチェックする仕組み。記事には次のようなコード例がある。
#if Unix
public static void Open(string path, bool securityDescriptor)
{
// call unix specific stuff
}
#else
public static void Open(string path)
{
// call windows specific stuff
}
#endif
このコードはランタイムが Unix をターゲットにしている場合には Open(string path, bool securityDescriptor)
を使用できるが、コード使用者はランタイムを限定しない場合 Open(string path)
を呼び出すコードを記述する。そのコードを Unix 環境下で実行した場合メソッドが存在しないエラーとなってしまう。このようなケースでは Unix 環境下において Open(string path)
を呼び出した場合に例外を投げるような形となるほうが望ましく、そういったケースを検出できる。
SourceGear Bridge preview: Swift with .NET in Xcode
https://ericsink.com/entries/sourcegear_bridge.html
.NET 以外の言語と .NET をブリッジして Xcode からコード編集できるようにする SourceGear Bridge がプレビュー。現時点では Swift がターゲット。
SourceGear Bridge を利用すると ASP.NET Core のコードを Swift で記述するといったことが可能になる。これは .NET から Swift プログラムをバインディングと共にホストする仕組みと Swift のコードから .NET を呼び出せるようにする仕組みによって実現されている。
async/await のサポートなども含めて、プロダクションレディを目指して開発を進めるとのこと。
Introducing Collection of New Visual Studio Themes! - Visual Studio Blog
https://devblogs.microsoft.com/visualstudio/custom-themes/
Visual Studio 2022 でテーマをインストールして使用できるようになったことの紹介記事。
コミュニティーによるテーマ (Ayu, Dacula, ...) や Visual Studio チーム提供の Theme Pack (Light+, Monokai, ...) の紹介とテーマの切り替え方法について。また Visual Studio Code のテーマからのコンバーターがあるということにも触れている(テーマの手書きは現実的ではないのでコンバーターの利用が事実上必須と思われる)。
HTTP/3 support in .NET 6 - .NET Blog
https://devblogs.microsoft.com/dotnet/http-3-support-in-dotnet-6/
.NET 6 での HTTP/3 のプレビューサポートについての記事。
HTTP/3 がなぜ重要か、.NET 6 では QUIC の実装として何を使用しているか、.NET 6 での利用方法について。
.NET での QUIC 実装は MSQuic を使用しているが、Linux では QUIC での TLS のハンドシェイク実装に必要な API が OpenSSL にないため、Akamai と協力し QuicTLS としてフォークしたものに QUIC に必要な最低限の変更を加えたものを静的リンクするようにした。
.NET アプリケーションから QUIC を扱うための System.Net.Quic
API は .NET 7 で公開するとしている。
また macOS では HTTP/3 のサポートが含まれていない。これは .NET の TLS の実装に macOS の SecureTransport を使用していることで QUIC に必要な API が足りないことによるもの。OpenSSL を使用してのサポートでは証明書管理が OS と別になるため、そのような依存は増やすことは避けたとのこと。
- microsoft/msquic: Cross-platform, C implementation of the IETF QUIC protocol.
- quictls/openssl: TLS/SSL and crypto library with QUIC APIs
Xamarin.Forms 5.0.0.2125 (5.0.0 Service Release 5) Release Notes - Xamarin | Microsoft Docs
Xamarin.Forms 5.0.0 Service Release 5 がリリース。
主にバグ修正。また依存している AndroidX ライブラリのバージョン引き上げも含まれる。
アーティクル、スライドなど
MicrosoftがXamarin Community Toolkit用の.NET MAUI Compatibility Packageをリリース
https://www.infoq.com/jp/news/2021/09/community-toolkit-maui-compat/
Xamarin Community Toolkit の .NET MAUI Compatibility Package についての記事。
Minimal APIs in .NET 6 but where are the Unit Tests?
https://www.hanselman.com/blog/minimal-apis-in-net-6-but-where-are-the-unit-tests
.NET 6 の ASP.NET Core の Minimal APIs でユニットテストを書くときはどうするのかという記事。これは単純に WebApplicationFactory<T>
を継承したテストアプリケーションクラスを作れば従来通り呼び出しテストを書くことができる。(参考リポジトリのコードを見るとこの記事内のコードは Todo
をセットしていて間違っている気がする…)
WebSocket per-message compression in ASP.NET Core 6
https://www.tpeczek.com/2021/09/websocket-per-message-compression-in.html
.NET 6 の ASP.NET Core で WebSocket のメッセージ単位の圧縮がサポートされ、それを利用する方法についての記事。
DangerousEnableCompression
プロパティという危険そうな名前の理由についても触れている。これはサポートされていないクライアントとのネゴシエーションで失敗するからといった理由ではなく、CRIME/BREACH 攻撃が可能となってしまうセキュリティー上の理由。(実際サポートされていなければ非圧縮にフォールバックする)
- WebSocketCreationOptions.DangerousDeflateOptions Property (System.Net.WebSockets) | Microsoft Docs
- aspnetcore/WebSocketAcceptContext.cs at v6.0.0-rc.1.21452.15 · dotnet/aspnetcore
MS Graph, Blazor WebAssembly and Azure Static Web Apps
https://dev.to/azure/ms-graph-blazor-webassembly-and-azure-static-web-apps-3p1d
Azure Static Web Apps にホストした Blazor WebAssembly のアプリケーションから Azure Active Directory と Graph API を使用して、ユーザー認証と情報取得を行う方法についての記事。
Pattern Matching Examples in C#
https://dev.to/this-is-learning/pattern-matching-examples-in-c-3g74
様々なパターンマッチの書き方の紹介の記事。
C# 10 で導入された Extended property patterns (ネストしたプロパティアクセスを .
で行える) についても。
RaspberryPi 3B+と.NET5で電子工作したい(準備/Lチカ)
https://zenn.dev/tera1707/articles/c458d65fee4cdc
Raspberry Pi 3B+ 上で .NET 5 アプリケーションからハードウェアをコントロールする導入記事。
Raspberry Pi への OS インストールから System.Device.Gpio
を使用してLチカ(LED を光らせる)するプログラムを実行するまでが書かれている。また続く記事で System.Device.Pwm
を使用したハードウェア PWM についても触れている。
Comparing WebApplicationBuilder to the Generic Host: Exploring .NET Core 6 - Part 2
.NET 6 の ASP.NET Core で従来の Generic Host を使用する形から、WebApplicationBuilder
を使用する形へと変わったことについての記事。
ASP.NET Core 2.x の WebHost と .NET 5 の Generic Host からの流れについても触れている。
WebApplicationBuilder
は Configuration
, Services
, Logging
そして IHostBuilder
と IWebHostBuilder
の設定を提供する、パイプライン以外を構築するためのビルダークラスとなった。またビルダーの Build
で生成されるインスタンスである WebApplication
はミドルウェアパイプラインを構築するためのもので、IHost
, IApplicaitonBuilder
, IEndpointRouteBuilder
を実装しているため、Routing や Endpoint の Use が不要となり簡潔な形となった、といった話。
【Unity】asmref(asmdefではない)を使うとinternalアクセスできて便利【Assembly Definition Reference Files】 - Qiita
https://qiita.com/su10/items/7773715c8e43058e533c
Unity 2019.2.0 で追加された Assembly Definition Reference (.asmref) についての記事。
Assembly Definition Reference は Assembly Definition のディレクトリにソースコードを差し込めるようにするという仕組み。記事では利用用途として「スクリプトの配置」「既存のアセットやパッケージの拡張」「Unity のパッケージの internal へのアクセス」といった例が挙げられている。
Entity Framework Core 6 の Compiled Models を試した - しばやん雑記
https://blog.shibayan.jp/entry/20210921/1632210374
Entity Framework Core 6 で実装された Compiled Models についての記事。
Compiled Models はあらかじめ dotnet-ef ツールで構築済み Model の生成を構築を行ったコードを生成しておくことでスタートアップパフォーマンスを向上する機能。記事ではコード生成と参照方法のほか、Lazy Loading に非対応なこと、GitHub Actions でコード生成を行う例などについて触れている。
ちなみに .NET Blog によると Source Generator として実装されなかったのは Visual Studio 内でコンテキストをビルド/実行することになり、Visual Studio そのものの安定性が損なわれてしまう可能性があったからとのこと。
.NET 6 の Blazor で改善されたエラー処理を使ってみる aka ErrorBoundary
https://zenn.dev/okazuki/articles/blazor-net6-errorboundary
.NET 6 の Blazor で導入されたエラーハンドリングのためのコンポーネント ErrorBoundary
についての記事。
今まではコンポーネントが例外をスローした場合、アプリケーションのグローバルでキャッチする形になっていたが ErrorBoundary
コンポーネントを使うことで例外を局所化してメッセージを出すといったことができるようになる。記事ではエラーが発生した後、復旧する方法についても触れられている。
Getting started with Roslyn code analysis
https://dev.to/timur_kh/getting-started-with-roslyn-code-analysis-1aki
Roslyn でソリューションを開いてコードを解析するまでの導入についての簡単な記事。
MSBuildLocator
と MSBuildWorkspace
を使用してソリューションを開き、CSharpSyntaxWalker
でシンタックスツリーをトラバースする方法についてなど。
Async processing of long-running tasks in ASP.NET Core
https://blog.elmah.io/async-processing-of-long-running-tasks-in-asp-net-core/
ConcurrentQueue<T>
と IHostedService
を使用して ASP.NET Core アプリケーションに簡単なバックグラウンド処理を実装する記事。
注意書きではとっかかりとしてはよいがロバストな構成とするため Hangfire や Quartz.NET の利用の検討するように触れられている。
Introduction to System.Text.Json Through Examples - Code Maze
https://code-maze.com/introduction-system-text-json-examples/
System.Text.Json
の各種クラスなどの利用方法についての記事。
シリアライズ/デシリアライズの方法や簡単なカスタマイズ方法 JsonDocument について、.NET 5 以降で使用できる HttpClient に対する拡張メソッドの紹介など。
Platform vs. PlatformTarget In Any .NET Build
https://dev.to/benvillalobos/platform-vs-platformtarget-in-any-net-build-252b
MSBuild の Platform
と PlatformTarget
プロパティについて。
PlatformTarget
はコンパイラーに渡されるもので、.NET Framework (non-SDK スタイル)のプロジェクトでは Platform
から、SDK スタイルのプロジェクトでは Platform
または RuntimeIdentifier
から定義される。その実際に定義されるまでの流れなどが解説されている。
ライブラリ、リポジトリ、ツールなど
byme8/ZeroIoC: ZeroIoC is reflectionless IoC Container for .NET
https://github.com/byme8/ZeroIoC
Source Generator でコード生成することで初回実行も含めて高速な動作を目的とした IoC コンテナー。
サイト、ドキュメントなど
.NET 6 ASP.NET Core Migration
https://gist.github.com/davidfowl/0e0372c3c1d895c3ce195ba983b1e03d
David Fowler 氏による .NET 6 の ASP.NET Core に移行するためのガイド。
ツイート
Hmm.... seems like @nuget install/uninstall icon could use dark theme compatible versions 🤔 pic.twitter.com/mBYqyIOm1A
— Daniel Cazzulino (@kzu) September 16, 2021
Visual Studio 2022 のダークテーマ対応が進んだ結果、NuGet アイコンが透過で黒いものの場合に視認性が悪くなってしまうという話。
Just learned that in the .NET CLR Header MetadataHeader Signature is the bytes 42 53 4A 42, which is HEX ASCII for 'BSJB' which is the initials for Brian Harry, Susan Radke-Sproull, Jason Zander & Bill Evans, who worked on it! Just learned this via @robcaron about @jlzander
— Scott Hanselman (@shanselman) September 17, 2021
.NET CLR のヘッダーのメタデータヘッダーシグネチャーが 42 53 4A 42
で ASCII では 'BSJB' となり、Brian Harry, Susan Radke-Sproull, Jason Zander, Bill Evans (.NET Framework の開発者)のイニシャルであるという小ネタ。これは Programming in the .NET Environment (2002) の序文に書かれている。
Generational aware analysis added in .NET 5 is just a killer feature! Now you may have a full insight what was alive in a given generation AND from which generations🤯 pic.twitter.com/F6a6QcdbzX
— Konrad Kokosa (@konradkokosa) September 17, 2021
.NET 5 で PerfView でのスナップショット解析で GC のジェネレーション単位の分類ができるようになったという話。
You can also declare the Program class as partial and add things to it while keeping your top level statements. This makes it possible to expose properties/fields/etc, declare a base class or implement an interface on the type that hosts the Program's entry point.#csharp pic.twitter.com/er9oSTc0Gf
— David Fowler 🇧🇧💉💉 (@davidfowl) September 18, 2021
.NET 6 RC1 以降で Top-level statements のコードを書いた際に生成される Program クラスにアクセスできるようになった。また、Program クラスは partial として生成されるので partial class を定義することで拡張できるというテクニック。
Literally just finished the pre-alpha-hack-poc for #SkiaSharp running on #Blazor #WebAssembly https://t.co/s4Dt8Kj1em pic.twitter.com/Ys6tTvB2dy
— Matthew "V 50%" Leibowitz (@mattleibow) September 18, 2021
SkiaSharp と Blazor WASM で Canvas 操作などを行える PoC ができたという話。
Previous C# versions don't support field initializers in the structs.
— Oleg Kyrylchuk (@okyrylchuk) September 17, 2021
C# 10 fixes it and closes the gap between struct and class declarations.
If the struct has field initializers, the compiler will synthesize a public parameterless constructor.#dotnet #coding #devcommunity pic.twitter.com/5XVfU0xQTS
C# 10 では struct に対してフィールド初期化子を記述した場合、パラメータなしのコンストラクターが自動生成されるようになった。なおパラメータありコンストラクターを記述した場合はパラメータなしコンストラクターは生成されないので注意。
TIL: PerfView has live events view command. For example, to observe all .NET exceptions on the machine:
— Konrad Kokosa (@konradkokosa) September 21, 2021
.\PerfView.exe UserCommand Listen Microsoft-Windows-DotNETRuntime:0x8000:Verbose:@EventIDsToEnable=80 pic.twitter.com/Pdfv89xpEK
.\PerfView.exe UserCommand Listen Microsoft-Windows-DotNETRuntime:0x8000:Verbose:@EventIDsToEnable=80
を実行することでコンピューター上のすべての .NET アプリケーションのあらゆる Exception を観測できるというテクニック。
Folks, a quick PSA about large MSBuild builds on CI.
— Kirill Osenkov (@KirillOsenkov) September 21, 2021
Too often I see a build taking upwards of 10-20 minutes with all sorts of text loggers (file loggers, console loggers), worst of all text loggers of diagnostic verbosity.
Text loggers absolutely kill your build performance.
CI などでの巨大な MSBuild ビルドを実行するときはテキストログを止めるとパフォーマンス向上できるという話。スレッドにはその方法や binlog の使用を進めるといった話も。
This will not RTM in C# 10 as there are significant toolchain issues that need to be sorted out before they can be generally used.
— Jared Parsons (@jaredpar) September 20, 2021
Generic 属性は .NET 6 にはツールチェイン側の対応の都合などもあり入らず(C++/CLI コンパイラーがクラッシュするなど)、.NET 7 / C# 11 になるという話。
This is the best thing I've found today. The [BestFriend] attribute 🤣 #dotnet https://t.co/VgN9peJFHj
— David Fowler 🇧🇧💉💉 (@davidfowl) September 19, 2021
ML.NET に BestFriend
属性という変わった名前の属性があるという話。
この属性は外部のアセンブリから内部 (internal) に対してアクセス可能であることを示すもので、外部のアセンブリは WantsToBeBestFriends
属性を持つ。InternalsVisibleTo
属性との違いは BestFriend
属性自体は特別な効果を持つものではなく InternalsVisibleTo
属性で internal にアクセスできるようになっている前提で、各種 internal なメンバーが外部のアセンブリからのアクセスを意図しているかどうかを Analyzer でチェックするためのマーカー。