主なトピックス
The Future of Visual Studio Extensibility is Here! - Visual Studio Blog という Visual Studio の拡張についての今後についての記事が公開されています。
この中でも Out-of-Process モデルの実装が始まったのが大きいかと思います。Phase 1ということで単純なコマンドモデルのみが実装可能なレベルですが、.NET 6 で実装できるようになりますし、今と同じ拡張可能な領域まで到達するのは今後長い時間がかかるとはいえ楽しみな部分です。
WeekRef.NET
この WeekRef.NET を公開して初めての更新となるので改めて WeekRef.NET について少し説明しておこうかなと思います。
元々 JavaScript 方面では JSer.info という一週間の JavaScript やブラウザに関連するリリースや記事などをまとめて紹介してくれる日本語のサイトがあり、個人的によく見ていました(ちなみに JSer.info は10年以上続いていてすごいです)。
そこで同じように .NET の方面にもそういった週ごとの .NET に絞った記事やリリースの日本語でのまとめが欲しいなとずっと思っていたものの、特にそういった物は出てこなかったのでそれなら勉強がてら自分で初めてみようとなりました(英語では Weekly まとめはいくつかあります)。
というわけで先に社内向けに4週間ぐらいお試ししてからスタートしたのですぐに力尽きることはないと思いますが、ゆるくほぼ週刊という感じでやっていければと思っています。
ヘッドライン
The Future of Visual Studio Extensibility is Here! - Visual Studio Blog
https://devblogs.microsoft.com/visualstudio/the-future-of-visual-studio-extensibility-is-here/
Visual Studio のこれからの拡張について。microsoft/VSExtensibility というリポジトリでアナウンスやサンプル、ドキュメントなどが公開される。
Visual Studio 2022 に向けての拡張は開発者がマイグレーションガイドに沿って移行する必要がある。CodeRush, VSVim, Productivity Power Tools のような人気の拡張は既に対応済み。
Language Server Protocol のサポートの拡張。Visual Studio 固有の Language Server Protocol の拡張についてのドキュメントの公開とそれをサポートする NuGet パッケージ。
Visual Studio Community Toolkit を使用して拡張を簡単に書けるように。
新しい Out-of-Process 拡張モデルのサポート Phase 1 の導入。プロセス分離によって Visual Studio の安定性や再起動の不要化などの利便性の向上を図る。Phase 1 では新しい API を使用して単一ファイルに対する lint やフォーマットのようなコマンドでの処理を実装できるようになる。Out-of-Proccess で動作する拡張は .NET 6 ベース。
Release Release v2.39.0 · grpc/grpc-dotnet
https://github.com/grpc/grpc-dotnet/releases/tag/v2.39.0
gRPC の .NET 実装 (grpc-dotnet) の 2.39.0 がリリース。
主に小さなバグフィックスのリリース。リトライポリシーでカルチャーによっては例外が発生する問題の修正や HedgingDelay が null の場合の処理の修正。
gRPC の本体も 1.40.0 がリリース。C-コアやC++, Python に関する変更を含むのみでピュアな C# 部分での変更はないため、Grpc.Core
パッケージを使用している場合にのみ C-core の更新の影響がある(C-core 版のパッケージバージョンは 2.40.0 であることに注意)。
.NET Enterprise Developer Day hosted by Amazon Web Services
AWS の .NET アプリ向けの開発者オンラインイベントが9月14日(日本時間)に開催。
Entity Framework Biweekly Status Updates (2021) · Issue #23884 · dotnet/efcore
https://github.com/dotnet/efcore/issues/23884#issuecomment-916251523
2週ごとの Entity Framework のステータス更新レポートの9月9日分。
C# Language Design Meeting for August 30th, 2021
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-08-30.md
C# 11 に向けて Initial Triage が行われた。C# 10 で Preview になっていた Generic Attributes や static abstract を初め、Discriminated Union、Statements as expressions、Expression Tree の強化などが検討されている。
ただし現時点では始まったばかりでこれを持って C# 11 にはどれが入る、入らないはまだわからないので注意が必要。
アーティクル、スライドなど
Taking the EF Core Azure Cosmos DB Provider for a Test Drive | .NET Blog
https://devblogs.microsoft.com/dotnet/taking-the-ef-core-azure-cosmos-db-provider-for-a-test-drive/
Entity Framework Core 6.0 で強化される Cosmos DB プロバイダーに関する紹介。
暗黙的なオーナーシップ (HasMany
のようなリレーションを開発者が明示的に指定しなくてよくなる)、プリミティブ型のコレクションのサポート、Raw SQL のサポートについて。
Which Azure Table Storage .NET SDK should I use?
https://medium.com/medialesson/which-azure-table-storage-net-sdk-should-i-use-a7f33fe294e
Azure Table Storage にアクセスするために使用できるパッケージ、WindowsAzure.Storage
, Microsoft.Azure.CosmosDB.Table
, Microsoft.Azure.Cosmos.Table
, Azure.Data.Tables
の違いについて。
New Improved Attach to Process Dialog Experience | Visual Studio Blog
https://devblogs.microsoft.com/visualstudio/new-improved-attach-to-process-dialog-experience/
Visual Studio 2022 のプロセスアタッチウィンドウの改善について。
プロセスの一覧にコマンドラインの詳細や IIS の App Pool 名の表示、リストの自動更新機能の追加、プロセスのツリー表示、ウィンドウから探す機能の追加。
Making «foreach» loop as fast as «for» loop
https://habr.com/en/post/575916/
Enumerator を何とかすることで foreach
でまわすのを for
並に速くできないのか?例えば Range のようなものに対する GetEnumerator()
拡張メソッドを作って列挙するようなケースで。という記事。
コンパイラーの空気を読むより for を書いたほうが簡単であるというオチではあるものの、いろいろなパターンでの JIT の結果との比較などを行い、インライン化によって遅くなる例なども見られる。
CSharpScriptでスクリプトファイル実行機能を実装する - Qiita
https://qiita.com/t0r/items/c89215f4bbf22b7a17ac
Microsoft.CodeAnalysis.CSharp.Scripting
を使用して C# スクリプティングを実装する方法について。
CSharpScript
クラスの Create
, RunAsync
, EvaluteAsync
の違いや、グローバルオブジェクトの取り扱い、実行結果を保持する ScriptState
に関する説明など、実用的な範囲まで網羅している。
Using Source Generators with Blazor components in .NET 6
https://andrewlock.net/using-source-generators-with-blazor-in-dotnet-6/
.NET 5 から .NET 6 に Blazor プロジェクトをアップデートした結果、Blazor コンポーネントに対するソースジェネレーターが動かなくなったことについての記事。
.NET 6 では Blazor の Razor テンプレートに対するコード生成がソースジェネレーターとなったため、ソースジェネレーターの結果にソースジェネレーターをかけることができない問題が発生する。<UseRazorSourceGenerator>false</UseRazorSourceGenerator>
を指定することで以前と同様の挙動に戻り、問題は回避できるが Hot Reload を初めとする新しい機能は使用できないので注意が必要。
- Reimplement the Razor compiler using source generators & support incrementality · Issue #26902 · dotnet/aspnetcore
- Components added by a source generator work in code, but not in markup · Issue #32172 · dotnet/aspnetcore
C#のSpan<T>やReadOnlySpan<T>と戯れる
https://zenn.dev/flipflap/articles/a72a3fc40605f7
Span<T>
や MemoryMarshal
, BinaryPrimitives
クラスを使った例について。Span<byte>
から unmanaged type
を作成する例や、エンディアンを考慮した読み込み、Span 同士での変換など。
How Visual Studio 2022 ate up 100 GB of memory and what XML bombs had to do with it
64bit になった Visual Studio 2022 に XML Bomb を開かせることで100GB超のメモリを消費させる記事。
以前からよく知られている XML の実体参照の展開で DoS のような負荷をかける手法が 64bit になった上で XML パーサーに制限をかけていないために効果的に作用した例。報告後に修正は行われた模様。
- Visual Studio 2022 Preview is vulnerable to XML bombs - Visual Studio Feedback
- Billion laughs攻撃 - Wikipedia
Xamarin.Android アプリが例外で落ちるということ | あじょろぐ
https://blog.azyobuzi.net/2021/08/28/01-xaexception/
Xamarin.Android における未処理例外の取り扱いについて。Java スレッド/.NET スレッドそれぞれで発生した未処理例外の内部的な取り扱いについての解説。
Ideation of an IDE: The .NET and ReactJS Love Affair
macOS 対応のため、WPF アプリケーションから React ベースの UI を持つアプリケーションに移行した事例についての記事。
UI は AvaloniaUI や Xamarin.Forms では WPF の問題は解決できなかったため、別なアプローチとして Web 技術を選択。その際に .NET のコードの再利用をしたかったため Electron.NET を検討したが、ASP.NET Core をホストするモデルのためレイテンシーやメモリ使用量などが満足いかなかったなど。
Chromium をホストすることにしたが CefSharp は Windows でのみのため、CefGlue を使用することにしラッパーを実装、それをホストする WPF または AvaloniaUI という構成に。
React と C# は TypeScript (View) から C# のコードを生成することで連携できる仕組みを用意したとのこと。仕組みとしては TypeScript 側で props のインターフェースを定義すると、C# 側でその props を公開するクラスを生成する模様。
- ReactView/ReactViewControl.Avalonia at master · OutSystems/ReactView
- OutSystems/WebView: Avalonia/WPF control that wraps CefGlue webview control
ライブラリ、リポジトリ、ツールなど
JetBrains/Refasmer: The tool to create reference assembly from common assembly.
https://github.com/JetBrains/Refasmer
既存のアセンブリからリファレンスアセンブリを生成するツール。
Redth/AndroidSdk.Tools: .NET Library + global tool for various Android SDK Manager, ADB, AVD, Emulator commands
https://github.com/Redth/AndroidSdk.Tools
Android SDK を操作するためのライブラリ。一部機能は .NET ツールとしても提供する。SDK Manager の操作や ADB の操作などが可能。
サイト、ドキュメントなど
Path.EndsInDirectorySeparator メソッド (System.IO) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.path.endsindirectoryseparator?view=net-5.0
.NET Core 3.0 以降で追加されたパスがセパレーターで終わるかどうかを返すメソッド。
破壊的変更: macOS 用の apphost を生成する - .NET | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/sdk/6.0/apphost-generated-for-macos
.NET Core SDK 3.0 以降では macOS 向けにビルドした際に appHost (アセンブリとともに配置される実行ファイル) がデフォルトで生成されなくなっていたが、.NET 6 では再び生成されるように変更される。その際生成される appHost ファイルにはアドホックなコード署名がつく。
- Codesign apphosts on Mac by mateoatr · Pull Request #53913 · dotnet/runtime
- macOS Catalina の公証に対応する | Microsoft Docs
ツイート
Tired of using SharpLab to decompile C# to IL?
— 👾 (@ashmind) September 6, 2021
No problem!
Thanks to great work by @konradkokosa and @vivekmapara you can now decompile IL to to C# instead.https://t.co/uQOpyvY43S pic.twitter.com/Uc1AmNp6wC
Now you can use https://t.co/o6xZEr63TE to learn CIL and immediately observe how it is JITted into native code😍 pic.twitter.com/jf5JAuZlSt
— Konrad Kokosa (@konradkokosa) September 7, 2021
SharpLab に IL から C# に変換する機能が追加され、結果として IL から JIT 結果まで見れるようになった。
Small snippit of C# code: Unit testing a memory leak with WeakReference.
— James Newton-King ♔ (@JamesNK) September 3, 2021
Pretty simple, but not something I've tried before 🤓https://t.co/LB3Q7HUxhf
開放されるべきオブジェクトを WeakReference に入れておくことでユニットテストで手っ取り早くメモリーリークを検出するというテクニック。
Here's a somewhat not well known trick in C#: you can define extension methods for pointers too! The extension needs to take a this ref parameter, and then the compiler will pick it up when using the normal -> operator on compatible pointers. Niche, but useful! 🚀#dotnet #csharp pic.twitter.com/ZoVq5Rkl2x
— Sergio Pedri (@SergioPedri) September 8, 2021
ref this
で定義した拡張メソッドはポインター型(int*
など)に対して使用でき、参照として渡ってくるのでうまく扱えるというテクニック。
I'd expect not having this struct copy here...👀 /cc:@EgorBo? pic.twitter.com/7qmWl1Ua21
— Konrad Kokosa (@konradkokosa) September 4, 2021
構造体を ref
渡ししているにもかかわらずコピーが発生してしまうことがあるというツイート。続くリプライにコンストラクターで初期化したりフィールドの数によっては問題なくコピーが発生しないようになるなど(難しくてあまりちゃんと理解していない…)。
Deep Dive
Support the Windows 11 I/O ring API · Issue #58752 · dotnet/runtime
https://github.com/dotnet/runtime/issues/58752
Windows 11 で io_uring のようなリングバッファベースの IO API ができるのでそれをサポートしてほしいという提案。
- ioringapi - Win32 apps | Microsoft Docs
- I/O Rings – When One I/O Operation is Not Enough – Winsider Seminars & Solutions Inc.
- Implement io_uring support for FileStream · Issue #51985 · dotnet/runtime
[API Proposal]: [RegexGenerator(...)] attribute · Issue #58880 · dotnet/runtime
https://github.com/dotnet/runtime/issues/58880
Regex をソースジェネレーターで事前にコンパイルしておくために RegexGenerator
属性を導入したいという提案。
Why can nameof not be used with alias-qualified types at the root level? - Stack Overflow
global::ClassA
のようなルート名前空間にある型をエイリアス付きで指定するものを typeof(global::ClassA)
のように typeof
では使えるのに nameof(global::ClassA)
で使えないのはなぜという話。