2021-09-10

Published on Friday, 10 September 2021

主なトピックス

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

https://www.eventbrite.com/e/net-enterprise-developer-day-hosted-by-amazon-web-services-registration-167917464657

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 を初めとする新しい機能は使用できないので注意が必要。

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

https://dev.to/vasilievserg/how-visual-studio-2022-ate-up-100-gb-of-memory-and-what-xml-bombs-had-to-do-with-it-2noh

64bit になった Visual Studio 2022 に XML Bomb を開かせることで100GB超のメモリを消費させる記事。

以前からよく知られている XML の実体参照の展開で DoS のような負荷をかける手法が 64bit になった上で XML パーサーに制限をかけていないために効果的に作用した例。報告後に修正は行われた模様。

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

https://medium.com/outsystems-engineering/ideation-of-an-ide-the-net-and-reactjs-love-affair-dc29a9dd26b6

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 を公開するクラスを生成する模様。

ライブラリ、リポジトリ、ツールなど

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 ファイルにはアドホックなコード署名がつく。

ツイート

SharpLab に IL から C# に変換する機能が追加され、結果として IL から JIT 結果まで見れるようになった。

開放されるべきオブジェクトを WeakReference に入れておくことでユニットテストで手っ取り早くメモリーリークを検出するというテクニック。

ref this で定義した拡張メソッドはポインター型(int* など)に対して使用でき、参照として渡ってくるのでうまく扱えるというテクニック。

構造体を 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 ができるのでそれをサポートしてほしいという提案。

[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

https://stackoverflow.com/questions/69116668/why-can-nameof-not-be-used-with-alias-qualified-types-at-the-root-level

global::ClassA のようなルート名前空間にある型をエイリアス付きで指定するものを typeof(global::ClassA) のように typeof では使えるのに nameof(global::ClassA) で使えないのはなぜという話。