2021-09-24: paint.net 4.3, Visual Studio 2022 for Mac Preview 1.4, Package Validation, SourceGear Bridge preview

Published on Friday, 24 September 2021

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

https://docs.microsoft.com/en-us/visualstudio/releases/2022/mac-release-notes-preview#17.0.0-priv-pre.1.4

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 と別になるため、そのような依存は増やすことは避けたとのこと。

Xamarin.Forms 5.0.0.2125 (5.0.0 Service Release 5) Release Notes - Xamarin | Microsoft Docs

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/release-notes/5.0/5.0.0-sr5#september-17-2021---xamarinforms-5002125-500-service-release-5

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 攻撃が可能となってしまうセキュリティー上の理由。(実際サポートされていなければ非圧縮にフォールバックする)

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

https://andrewlock.net/exploring-dotnet-6-part-2-comparing-webapplicationbuilder-to-the-generic-host/

.NET 6 の ASP.NET Core で従来の Generic Host を使用する形から、WebApplicationBuilder を使用する形へと変わったことについての記事。

ASP.NET Core 2.x の WebHost と .NET 5 の Generic Host からの流れについても触れている。

WebApplicationBuilderConfiguration, Services, Logging そして IHostBuilderIWebHostBuilder の設定を提供する、パイプライン以外を構築するためのビルダークラスとなった。またビルダーの 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 でソリューションを開いてコードを解析するまでの導入についての簡単な記事。

MSBuildLocatorMSBuildWorkspace を使用してソリューションを開き、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 の PlatformPlatformTarget プロパティについて。

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 に移行するためのガイド。

ツイート

Visual Studio 2022 のダークテーマ対応が進んだ結果、NuGet アイコンが透過で黒いものの場合に視認性が悪くなってしまうという話。

.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) の序文に書かれている。

.NET 5 で PerfView でのスナップショット解析で GC のジェネレーション単位の分類ができるようになったという話。

.NET 6 RC1 以降で Top-level statements のコードを書いた際に生成される Program クラスにアクセスできるようになった。また、Program クラスは partial として生成されるので partial class を定義することで拡張できるというテクニック。

SkiaSharp と Blazor WASM で Canvas 操作などを行える PoC ができたという話。

C# 10 では struct に対してフィールド初期化子を記述した場合、パラメータなしのコンストラクターが自動生成されるようになった。なおパラメータありコンストラクターを記述した場合はパラメータなしコンストラクターは生成されないので注意。

.\PerfView.exe UserCommand Listen Microsoft-Windows-DotNETRuntime:0x8000:Verbose:@EventIDsToEnable=80 を実行することでコンピューター上のすべての .NET アプリケーションのあらゆる Exception を観測できるというテクニック。

CI などでの巨大な MSBuild ビルドを実行するときはテキストログを止めるとパフォーマンス向上できるという話。スレッドにはその方法や binlog の使用を進めるといった話も。

Generic 属性は .NET 6 にはツールチェイン側の対応の都合などもあり入らず(C++/CLI コンパイラーがクラッシュするなど)、.NET 7 / C# 11 になるという話。

ML.NET に BestFriend 属性という変わった名前の属性があるという話。

この属性は外部のアセンブリから内部 (internal) に対してアクセス可能であることを示すもので、外部のアセンブリは WantsToBeBestFriends 属性を持つ。InternalsVisibleTo 属性との違いは BestFriend 属性自体は特別な効果を持つものではなく InternalsVisibleTo 属性で internal にアクセスできるようになっている前提で、各種 internal なメンバーが外部のアセンブリからのアクセスを意図しているかどうかを Analyzer でチェックするためのマーカー。