主なトピックス
.NET 6 RC 1 と Visual Studio 2022 Preview 4 がリリースされました。RC ということで若干の breaking changes はありますが GA に向けたステップといったリリースです。Preview から Go live ライセンスとなったのでプロダクション環境での利用が可能になります。
また、マルチプラットフォームアプリを作るためのフレームワーク MAUI は .NET 6 には入らないことなどがアナウンスされています。
- Announcing .NET 6 Release Candidate 1 - .NET Blog
- Visual Studio 2022 Preview 4 is now available! - Visual Studio Blog
- Update on .NET Multi-platform App UI (.NET MAUI) - .NET Blog
Uno Platform 3.10 がリリースされました。.NET 6 RC1 への対応や Windows 11 のスタイルなどに対応したようです。
Silverlight のオープンソース代替実装、OpenSilver のベータがリリースされました。これは C#/WPF を Web 技術上で動かす CSHTML5 をベースとして Silverlight のコードを Web 技術上で動かすものです。Silverlight は2021年10月12日でサポート終了するため、その延命処置としてといった目的が大きそうです。
.NETのクラスライブラリ設計 改訂新版の予約が Amazon でできるようになりました。10月7日に発売だそうです。
ヘッドライン
Announcing .NET 6 Release Candidate 1 - .NET Blog
https://devblogs.microsoft.com/dotnet/announcing-net-6-release-candidate-1/
.NET 6 Release Candidate 1 がリリース。RC1 以降では機能の追加などから GA に向けて品質の向上にフォーカスする形。 また、このバージョンから "go live" ライセンスとなり実運用環境での使用がサポートされる。 Visual Studio 2022 Preview 4と共に使用することが前提で Visual Studio 2022 for Mac Preview 1 は追って対応。
記事ではソースからビルドすること(.NET 6 で tarball からビルドできるようになったなど)、Profile-guided optimization、Crossgen2、セキュリティー関連についてなどが触れられている。
- ASP.NET Core updates in .NET 6 Release Candidate 1 - ASP.NET Blog
- Update on .NET Multi-platform App UI (.NET MAUI) - .NET Blog
Visual Studio 2022 Preview 4 is now available! - Visual Studio Blog
https://devblogs.microsoft.com/visualstudio/visual-studio-2022-preview-4-is-now-available/
Visual Studio 2022 Preview 4 がリリース。
ファイル内検索が改善され、大きいソリューションなどでは3倍近く早くなった。
ブレークポイントの条件に "Dependent Breakpoint" という「特定のブレークポイントにかかっていた場合にブレークする」という設定の追加。ASP.NET での CSS 同期や MAUI サポートを初めとするホットリロード機能の強化。フォルダー階層と名前空間を合わせる "Sync Namespaces" の追加(ReSharper の Adjust Namespaces 相当)。
Update on .NET Multi-platform App UI (.NET MAUI) - .NET Blog
https://devblogs.microsoft.com/dotnet/update-on-dotnet-maui/
MAUI の状況と .NET MAUI Preview 8 について。
MAUI は開発状況的に .NET 6 の11月の GA には入らず、2022年の Q2 での GA を目指すとのこと。それまでは Xamarin の強化を行い、製品開発への採用は Xamarin を推奨する。.NET 6 GA の段階で必要な機能は提供するがしばらくはプレビューで品質向上と移行のための準備を進める。
また .NET 6 RC1 では "Go Live" だが、MAUI は除外され、RC2 で Preview となる。
Visual Studio 2022 Preview 4 の Mobile development with .NET ワークロードに MAUI が含まれるようになった。Windows デスクトップアプリケーションをターゲットにしたい場合には "Desktop Development with .NET", "UWP", "Desktop Development with C++" ワークロードも必要。
また、XAML のホットリロードにも対応し、Windows をはじめ iOS, Android でも同様に動作する。
.NET MAUI SDK はアップデートで ASP.NET Core などと同様に .NET Host Builder パターンを使用するようになった。
WinUI 2.7 Release Notes - Windows apps | Microsoft Docs
https://docs.microsoft.com/en-us/windows/apps/winui/winui2/release-notes/winui-2.7
Windows UI Library 2.7 がリリース。
InfoBadge コントロール、ColorPicker の方向設定(横置き)の追加。
.NET September 2021 Updates – 5.0.10 and 3.1.19 - .NET Blog
https://devblogs.microsoft.com/dotnet/september-2021-updates/
.NET 5.0.10 と 3.1.19 がリリース。
セキュリティーアップデートを含まない、信頼性やその他バグ修正等の改善。
.NET 5 の Runtime には GCConserveMemory
という GC の設定が追加された。GCConserveMemory
は Gen 2 で意味のある生きたデータの割合の閾値で設定値として 1-9 をとる。例えば 3 を指定した場合には Gen 2 にあるべきデータは 30% となり、これによってフラグメンテーションが 70% 以上になるとよりブロッキング Gen 2 GC が実行される(つまり大きい値を指定すると Gen 2 をコンパクトに保とうとする)。
- September 2021 .NET Updates · Issue #200 · dotnet/announcements
- Fix high frag in gen2 by PeterSolMS · Pull Request #48601 · dotnet/runtime
Uno Platform 3.10: Day-0 support for .NET 6 RC1, WinUI InfoBadge, Windows 11 Fluent Styles
Uno Platform 3.10 がリリース。
.NET 6 RC1 への対応や Windows 11 のスタイルなどに対応、WinUI に追加された InfoBadge への対応など。多くの改善と修正、サンプルコードの追加が行われた。
HTTP/3: Enable in Kestrel by default in .NET 7 · Issue #36486 · dotnet/aspnetcore
https://github.com/dotnet/aspnetcore/issues/36486
.NET 7 で Kestrel の HTTP/3 サポートがデフォルトで有効になる予定。
Introducing OpenSilver
https://opensilver.net/announcements/introducing-opensilver.aspx
Silverlight のオープンソース代替実装、OpenSilver のベータがリリース。
C#/WPF を Web 技術上で動かす CSHTML5 をベースとして Silverlight のコードを Web 技術上で動かすツールキット。
- OpenSilver/OpenSilver: This repository contains the source of both OpenSilver and CSHTML5. More information is available at: www.opensilver.net and www.cshtml5.com - Read README.md for the instructions on how to build the source code and how to test it.
- Silverlight のサポート終了日
Open sourcing the .NET 5 C# Language Extension for SQL Server - Microsoft SQL Server Blog
SQL Server 2019 から利用できる外部コードを実行することで様々な言語を呼び出せる仕組みで .NET 5 / C# を使用する拡張がオープンソースで公開された。
- SQL Server 2019 on Windows の Language Extension で .NET 5 C# が動作するようになりました at SE の雑記
- SQL Server 言語拡張とは? | Microsoft Docs
- sql-server-language-extensions/language-extensions/dotnet-core-CSharp at main · microsoft/sql-server-language-extensions
Release 1.4.0-beta.3 · mysql-net/MySqlConnector
https://github.com/mysql-net/MySqlConnector/releases/tag/1.4.0-beta.3
Async MySQL Connector の 1.4.0-beta.3 がリリース。
1.4.0 シリーズでは .NET 6 のサポートの追加や、netstandard1.3 のサポートの削除などが行われている。
Release v5.0.10 · npgsql/npgsql
https://github.com/npgsql/npgsql/releases/tag/v5.0.10
Npgsql 5.0.10 がリリース。
様々な不具合の修正と、xid8
データ型のサポートの追加など。
Security Bulletin - Announcements - Travis CI Community
https://travis-ci.community/t/security-bulletin/12081
Travis CI の脆弱性について。パブリックなリポジトリをフォークした先で PR を作った際に元リポジトリの Secrets が露出してしまう問題があった。
経緯や対応方法は下記の記事が詳しいので Travis CI を使用していた場合には対応が推奨。
アーティクル、スライドなど
Introducing Package Source Mapping - The NuGet Blog
https://devblogs.microsoft.com/nuget/introducing-package-source-mapping/
複数の NuGet パッケージソースを持つ場合に特定のパッケージやパッケージ名のパターンでどのパッケージソースを使用するか指定できる機能についての記事。
例えば特定の名前のパッケージ(Contoso
や Contoso.*
)は常に社内の NuGet パッケージレジストリを使うといったことが可能となる。
Visual Studio 2022 Preview 4 または nuget.exe 6.0.0-preview.4 または .NET SDK 6.0.100-rc.1 (.NET 6 RC1) 以降が必要。
Reflection via source generators
https://dev.to/byme8/aot-reflection-4ijb
Source Generator でリフレクションで取得するようなものをあらかじめ生成しておくことでリフレクションのようなことをする場合でもパフォーマンスを稼げるのではないかというアイデアの記事。
C#でIDisposableをusingしたのにDisposeしてくれない件
http://makiuchi-d.github.io/2021/09/16/csharp-using-idisposable.ja.html
場合によっては try-finally
の finally
が呼び出されないことがあるという話。
通常例外がエントリーポイントまでさかのぼって catch
されなかった場合、「ハンドルされていない例外 (Unhandled Exception)」となりアプリケーションが終了される。その際、一番外側でも catch
がない場合 finally
が実行されない可能性がある。
static void Main(string[] args)
{
try
{
try
{
throw new Exception();
}
finally
{
// 実行される
Console.WriteLine("Finally2");
}
}
catch (Exception e)
{
// ここで throw すると結局 Unhandled Exception となるので try-catch-finally の finally は実行されない可能性がある
throw;
}
finally
{
// 実行されない可能性がある
Console.WriteLine("Finally");
}
}
大抵はユーザーコードにたどり着くまでにフレームワークのどこかで try-catch が含まれているので問題にならないが、素のコンソールアプリケーションや Top-level Statements などで、using
/ using var
を利用している場合等で問題になる可能性がある。
計量的な統計を扱うためのSystem.Diagnostics.Metrics API - Qiita
https://qiita.com/skitoy4321/items/ae506268fb18fc2ac54d
.NET 6 で追加される System.Diagnosics.Metrics API についての記事。API の概要とシナリオ、実際の使い方などを解説。
Web API (OpenAPI) の探索やテストに便利な HttpRepl を使ってみた
https://zenn.dev/08thse/articles/47-tool-httprepl
.NET Tools として提供されている HTTP を REPL のような形で操作できる HttpRepl の使い方の記事。
Apples in MAUI
https://www.telerik.com/amp/apples-maui/WEx1ZE1sRUVUWkE5S0dNbEhBNXJyUkU3T1Q4PQ2
MAUI で iOS アプリケーションを動かすまでの macOS 開発環境でのステップバイステップ。
[雑記] コンパイル結果に影響を及ぼす属性
https://ufcpp.net/study/csharp/start/miscreservedattribute/
AttributeUsage
や Conditional
, Obsolete
など実行時に属性を解釈するのではなくコンパイル時にコンパイラーが知るためにある属性についての記事。
NullableContext
のようなコンパイラーが生成する属性についても。
API Versioning in ASP.net Core - .NET Core Tutorials
https://dotnetcoretutorials.com/2017/01/17/api-versioning-asp-net-core/
ASP.NET Core で API のバージョニングを実現する Microsoft.AspNetCore.Mvc.Versioning の使い方についての記事。
.NET5.0製のREST APIサーバーを、AWS CodePipelineでビルドしてコンテナ化してECSでデプロイする。 - Qiita
https://qiita.com/tricrow/items/dad78c99cb77c7c6be9b
.NET 5 アプリケーションを AWS CodePipeline/CodeBuild でビルドして、ARM (Graviton) な ECS インスタンスで動かすという話。
Debugging a .NET App on Linux from Windows Visual Studio with WSL - NDepend
https://blog.ndepend.com/debugging-a-net-app-on-linux-from-windows-visual-studio-with-wsl
Visual Studio から .NET 5 アプリケーションを WSL 2 上の Linux で動かしてデバッグするための手順についての記事。
.NET Framework のアプリを移植してきた場合、DebugType
が full
となっている場合があるので portable
にするようにといった話も。
SOCKS Proxy Support In .NET - .NET Core Tutorials
https://dotnetcoretutorials.com/2021/07/11/socks-proxy-support-in-net/
.NET 6 で SOCKS プロキシーに対応したのでその使用方法についての記事。
- SOCKS4/4a/5 proxy support in SocketsHttpHandler by huoyaoyuan · Pull Request #48883 · dotnet/runtime
Looking inside ConfigurationManager in .NET 6: Exploring .NET Core 6 - Part 1
https://andrewlock.net/exploring-dotnet-6-part-1-looking-inside-configurationmanager-in-dotnet-6/
ConfigurationBuilder の代わりとなる .NET 6 で導入された ConfigurationManager についての違いと利点などについての記事。
ConfigurationManager は IConfigurationBuilder
を実装しているが ConfigurationBuilder と異なり、設定ソースの追加と削除が行われた時点で設定が確定するため部分的な取り出しが簡単になっている (IConfigurationRoot
を実装していて自身を返すだけになっている)。ConfigurationBuilder
は一度 Build
しないと読めないため、設定に依存する設定がある場合の取り回しが悪かった。
新たなWeb認証オプションと.NET MAUI Essentialsを加えたXamarin.Essentials 1.7
https://www.infoq.com/jp/news/2021/09/xamarin-essentials-1-7/
Xamarin.Essentials 1.7 についての記事。Web 認証と MAUI 対応について。
Backend For Frontend Authentication Pattern with Auth0 and ASP.NET Core
https://auth0.com/blog/backend-for-frontend-pattern-with-auth0-and-dotnet/
Backend for Frontend (BFF) のような構成で Auth0 と ASP.NET Core を使った認証実装パターンについての記事。
Minimal APIs at a glance in .NET 6
https://www.hanselman.com/blog/minimal-apis-at-a-glance-in-net-6
.NET 6 (ASP.NET Core) の Minimal API を使用したサンプルコードの記事。
ライブラリ、リポジトリ、ツールなど
EgorBo/StaticPGO_Example: How to collect a static (not the dynamic one) PGO and re-use it during "dotnet publish"
https://github.com/EgorBo/StaticPGO_Example
.NET 6 の Static PGO を試すためのサンプルリポジトリ。
mayuki/Kokuban: Simplifies styling strings in the terminal for .NET application
https://github.com/mayuki/Kokuban
コンソールに表示される文字列に対して色や下線など装飾を行うためのライブラリ。
mayuki/Chell: Write scripts with the power of C# and .NET
https://github.com/mayuki/Chell
シェルスクリプトのような作業を C# でも書きやすくするためのプロセス実行とユーティリティのライブラリ。
サイト、ドキュメントなど
Scott Hanselman (@shanselman) TikTok | Watch Scott Hanselman's Newest TikTok Videos
https://www.tiktok.com/@shanselman
Scott Hanselman の TikTok。
.NETのクラスライブラリ設計 改訂新版 (マイクロソフト関連書) | Krzysztof Cwalina、Jeremy Barton、Brad Abrams, 猪股 健太郎、河合 宜文 (監訳), 藤原 雄介 |本 | 通販 | Amazon
https://www.amazon.co.jp/dp/4296080040
.NETのクラスライブラリ設計 改訂新版の発売日が10月7日となり、Amazon での予約が開始。
ツイート
New create option in @AzureFunctions to create apps with .NET 6 🎉
— Jeff Hollan (@jeffhollan) September 10, 2021
Go give it a try! pic.twitter.com/El855SLeGM
Azure Functions で .NET 6 が Preview という形で使用できるように(これまでは Early Preview 扱い)。
Your binlogs will be smaller and your builds will be faster! https://t.co/uEhA1t3zIE
— Kirill Osenkov (@KirillOsenkov) May 20, 2021
MSBuild が 16.10 で文字列の dedup するようになって binlog が小さくなって、ビルドが速くなったという話。他にも binlog にファイルを埋め込めるようになった等の改善点など。
- Deduplicate strings in binlogs by KirillOsenkov · Pull Request #6017 · dotnet/msbuild
- Add support for embedding arbitrary files into binlog by KirillOsenkov · Pull Request #6339 · dotnet/msbuild
Optimized version 🏎️
— Alexandre Mutel (@xoofx) September 12, 2021
If build time only is enough for your codegen, you can still use RegisterForSyntaxNotifications and detect build time by checking entry assembly != null https://t.co/fXKdxTSzSA
By doing so, your codegen will have *zero* impact at IDE time/keystrokes! 😎 pic.twitter.com/HZx3VObLlB
Source Generator から Assembly.GetEntryAssembly()
が null
かどうかを調べることで IDE 上で動いているかどうか確認できるので、ビルド時にのみ実行したい Source Generator を作る場合には使えるというテクニック。
For 17.0, we have fully NGEN'd most major assemblies, most of which is in Preview 4, with a trailing set of assemblies in a future preview.
— David Kean (@davkean) September 15, 2021
Visual Studio が 64bit になったことでアドレス空間に余裕ができた。例えばアドレス空間を節約するため NGEN の対象はよく使われるコードパスのもののみに絞っていた(のでたまに JIT が走る)が、主要なアセンブリの大半を NGEN できるようになったという話。
https://t.co/4PmXMQN7SX Core SignalR is one of the things I'm most proud of engineering wise. Lots of lessons were learnt building the first version that went into building its successor. Here is an example of native IAsyncEnumerable<T> streaming #dotnet #signalr pic.twitter.com/7wEmonu6Zp
— David Fowler 🇧🇧💉💉 (@davidfowl) September 15, 2021
SignalR の Hub は IAsyncEnumerable<T>
をサポートしているのでデータのストリーミングできるという話。
Deep Dive
Add initial regex source generator by stephentoub · Pull Request #59186 · dotnet/runtime
https://github.com/dotnet/runtime/pull/59186
Regex の Source Generator の初期実装のPR。
Source Generator であらかじめ正規表現マッチ用のコードを生成しておくことでパフォーマンスを向上することが目的。
現時点では RegexOptions.Compiled
のコードを流用して、C# の Regex のマッチ用のコードを生成する形。
Need to run non-English text through UTF8Encoding for PGO scenarios · Issue #57698 · dotnet/runtime · GitHub
https://github.com/dotnet/runtime/issues/57698
.NET 6 で PGO をかけた結果 UTF8Encoding が遅くなってしまうケースが発生しているという話。
Non-English なテキストを処理するようなデータでプロファイルしていないため、ギリシャ語やキリル文字を処理するようなケースでパフォーマンスが若干低下している。多分日本語も該当する可能性がある。コアライブラリは元から PGO で最適化された R2R の形式で出荷されているので影響を受ける。
Add FreeBSD RIDs to known targets by josteink · Pull Request #11972 · dotnet/installer
https://github.com/dotnet/installer/pull/11972
インストーラーが知っている Runtime Identifier に FreeBSD が追加することでインストールできるようにする PR。
Support multi-targeting for Roslyn components by eerhardt · Pull Request #20793 · dotnet/sdk
https://github.com/dotnet/sdk/pull/20793
Roslyn のバージョンが Visual Studio 2019 (Roslyn 3.10) と 2022 (Roslyn 4.0) という形で複数ある都合、読み込むものを分けられるようにするという PR (マルチターゲット化)。
Marshal.AllocHGlobal/FreeHGlobal is ~150x slower in .NET than legacy mono on device (tvOS) · Issue #58939 · dotnet/runtime
https://github.com/dotnet/runtime/issues/58939
tvOS で Marshal.AllocHGlobal/FreeHGlobal が急激に遅くなったのだけどなぜ?という話。レガシー Mono では問題なかったが .NET ではとても遅い、となっているが実際はランタイム自体はどちらも Mono で .NET 6 世代で Marshal.AllocHGlobal
の実装が .NET の NativeMemory.Alloc
に変わった影響。
Mono の固有実装と異なり素直に P/Invoke を使うようになった影響で P/Invoke 呼び出しの GC セーフにするための処理でオーバーヘッドが生まれてしまった。
[API Proposal]: Add Arm64 to ProcessorArchitecture and ImageFileMachine enums · Issue #58970 · dotnet/runtime
https://github.com/dotnet/runtime/issues/58970
ProcessorArchitecture
と ImageFileMachine
に ARM64 の値がないので増やしたいという提案。
ところがそもそもこの値は .NET Core/.NET 5 以降では事実上の非推奨でほぼ機能しておらず、むしろ AssemblyName
にある ProcessorArchitecture
は Obsolete にしたいという話に。
Create using-alias-types.md by CyrusNajmabadi · Pull Request #5174 · dotnet/csharplang
https://github.com/dotnet/csharplang/pull/5174
名前を持つ型に対するエイリアスとして using A = Foo.Bar.Baz;
はできるが、using Position = (int X, int Y);
のようなタプルや配列型、ポインター型などに対するエイリアスは定義できないので定義できるようにする提案。
[Proposal]: Event hookup in object initializer · Issue #5176 · dotnet/csharplang
https://github.com/dotnet/csharplang/issues/5176
オブジェクト初期化子で event ハンドラーをセットできてもいいのではないかという提案。