トピックス
Pyjion - A Python JIT Compiler
CPython に .NET ランタイムの JIT コンパイラーを組み込み利用することで高速化するというライブラリ。
Python のコードの変更は有効化する一行程度で対応可能で、pyjion
コマンドによる直接実行もサポートしている。
元々は Microsoft の Organization で開発されていたが、現在は Anthony Shaw 氏 (Microsoft の Python Advocate) の個人リポジトリーに移動して開発が続き、リリースされている。
Discover Evergine... more than ever! - Evergine
https://evergine.com/discover-evergine/
Wave Engine という名前の 3D グラフィックスエンジンが Evergine という名前でリブランディングした。
Evergine は C# と .NET をベースとしたエンジンでクロスプラットフォームに対応している。このリリースでは .NET 6 と C# 10, Visual Studio 2022 への対応が含まれるとのこと。
paint.net 4.3.3 is now available!
https://forums.getpaint.net/topic/118933-paintnet-433-is-now-available/
Paint.NET 4.3.3 がリリースされた。
このバージョンで .NET 6 への移行が行われ、レンダリングや起動のパフォーマンスの向上の他、プラグインの C# 10 での実装が可能となった。また、COM 以外の相互運用コードを TerraFX.Interop.Windows に移行し、今後 COM 相互運用コードも移行することで C++/CLI を排除でき、crossgen2/ReadyToRun の恩恵を受けられるようになるとのこと。
アーティクル、スライドなど
[CallerArgumentExpression] and throw helpers: Exploring .NET Core 6 - Part 11
https://andrewlock.net/exploring-dotnet-6-part-11-callerargumentexpression-and-throw-helpers/
.NET 6 で追加された CallerArgumentExpression
属性についてとそれを使用した例外を投げるヘルパーについての記事。
例外ヘルパーによる利点として、メソッドのコードが簡素になる、JIT でインライン化しやすくなるといった点にも触れている。
【C#】本物の関数ポインタの使い方と関数アドレスの取り方 - Qiita
https://qiita.com/Kujiro/items/9e442b0e9fb98ad904d8
C# 9 で導入された関数ポインター型 (delegate*
) についてとその使用方法について。
Configuring dotnet-monitor with Prometheus and Grafana - Dotnetos
https://dotnetos.org/blog/2021-11-22-dotnet-monitor-grafana/
dotnet-monitor
を Prometheus と Grafana を組み合わせて .NET のメトリクスを視覚化する方法についての記事。
記事ではサンプルアプリケーションを使用して Prometheus に dotnet-monitor
のデータを格納し、Grafana で視覚化するまでをステップバイステップで説明している。
【C# 10.0】 トップ レベル ステートメントの変更点
https://ufcpp.net/blog/2021/11/top-level-csharp10/
C# 10 のトップレベルステートメントに関する記事。
C# 9 からの変更点として空ステートメントについてとトップレベルステートメントを含むクラス名について触れている。
【Unity】UnityEngine.Object の Null チェックまとめ - コガネブログ
https://baba-s.hatenablog.com/entry/2021/11/16/090000
Unity の UnityEngine.Object は比較演算子のオーバーロードを持ち、null に対する独特な比較を実装しているため、その挙動についてまとめた記事。
オブジェクトを Destory した後のタイミングごとの結果や ??
のような演算子での結果にも触れている。
.NET 6 Hot Reload and "Refused to connect to ws: because it violates the Content Security Policy directive" because Web Sockets
Content Security Policy (CSP) を設定していることでホットリロードのための WebSocket 通信ができなくなってしまうという記事。
QUICスタックとTLSライブラリの関係とOpenSSLの状況
https://medium.com/nttlabs/quic-tls-relation-and-openssl-circumstance-fca824169b46
QUIC のスタックとそれに関連した TLS の位置づけと依存しているライブラリーの状況についての記事。
QUIC での TLS の処理の流れや QUIC に必要な機能を OpenSSL に追加する必要がある中での現状などに触れている。
.NET 6 で Blazor WebAssembly 環境構築でエラーした話
https://zenn.dev/naminodarie/articles/0fa46bf42b18e0
.NET 6 で Blazor WebAssembly の wasm-tools をインストールする際に Preview 版がインストールされているとエラーとなることがあるという話。
WinUI3 Desktopで開発したアプリのインストール戦略 (Windows App SDK) - Qiita
https://qiita.com/hayashida-katsutoshi/items/eba4fe2e9332e87cdc8f
WinUI 3 を使用したアプリケーションのインストール形態についての記事。
- WinUI3 Desktopでダークモードに対応する (Windows App SDK) - Qiita
- WinUI3 Desktopでウィンドウのサイズを変更する (Windows App SDK) - Qiita
【C#】.NET6のBlazor WebAssemblyのJS呼び出しは200倍早い - Qiita
https://qiita.com/Kujiro/items/0d6510525aa8d8289b01
.NET 6 では Blazor WebAssembly 環境で .NET 側のコードから JavaScript 側にバイト列を渡す際に Uint8Array となったことでパフォーマンスが向上されたという話。
【C# 10.0】 AppendLiteral(" ")
https://ufcpp.net/blog/2021/11/AppendLiteral/
C# 10 / .NET 6 で改善された文字列補完式で使用される DefaultInterpolatedStringHandler
の AppendLiteral
メソッドについての記事。
AppendLiteral(string)
があって AppendLiteral(char)
がない理由について。
Entity Framework Core 上で C# の文字列補間を使って安全に SQL 文を実行するが、SQL 文そのものを動的に組み立てたい | @jsakamoto
https://devadjust.exblog.jp/28969310/
Entity Framework Core では ExecuteSqlInterpolatedAsync
メソッドを使用することで文字列補完で安全に SQL のパラメータを指定できる仕組みがあるが、そのメソッドに渡す文字列を動的に変更したい場合にはどうすればいいのかという記事。
記事では FormattableStringFactory.Create
を使用して FormattableString
を生成する方法が紹介されている。
Meet Rider 2021.3’s new Problems View | The .NET Tools Blog
https://blog.jetbrains.com/dotnet/2021/11/24/meet-rider-2021-3-new-problems-view/
Rider 2021.3 で導入される Problems View の紹介記事。
Problems View ではファイルの問題をはじめ、ソリューションやツールキットといったものの問題を一元的に確認できるビューになるとのこと。
【C#】配列、stringの内部実装とSpan<T>のありがたみ - Qiita
https://qiita.com/Kujiro/items/e1998b14176419b3ad1a
String の内部表現とデータを取り扱う上での Span<T>
の必要性についての記事。
Manually Removing .NET SDKs from MacOS
https://dev.to/justinyoo/manually-removing-net-sdks-from-macos-4jce
macOS で .NET SDK を削除する方法についての記事。ツールではなく手動で削除する方法について。
.NET 6 と .NET 5 でXmlSerializerを用いたXML出力結果が異なる
https://zenn.dev/yukg/articles/d9c95e93d6932b
.NET 6 の XmlSerializer
ではパフォーマンス向上を目的としてデフォルトのシリアライズ結果としてインデントなどが含まれなくなったことについての記事。
DateTime.MinValue や new DateTime() は危険 - Life like a clown
https://clown.cube-soft.jp/entry/2021/11/26/datetime-trap
DateTime.MinValue
や new DateTime()
を扱うことについての危険性についての記事。
DateTime.MinValue
と new DateTime()
は 1/1/0001 12:00:00 AM
となるので、例えば JST から UTC に戻そうとして愚直に9時間を引くといったことをすると例外が発生する。記事ではこのようなケースを避けるために、最小の値としてアプリケーションで決めた固有の値を使用すること、ToUniversalTime
を使用すること、nullable にすることなどがあげられている。
ライブラリ、リポジトリ、ツールなど
Elringus/DotNetJS: Use .NET in any JavaScript environment: browsers, Node.js, VS Code web extensions, etc.
https://github.com/Elringus/DotNetJS
.NET の WebAssembly 出力を Blazor ではなく、Node.js やブラウザーといった JavaScript ランタイムで動作させるためのライブラリー。.NET のコードを WebAssembly として出力し、JavaScript のコードとの相互での呼び出しが可能にする仕組みを提供する。
xoofx/SharpNng: SharpNng is a lightweight low-level managed wrapper around the Lightweight Messaging Library NNG
https://github.com/xoofx/SharpNng
軽量メッセージングライブラリーの NNG の .NET のラッパーライブラリー。
Hey, while I haven't been coding for a while, I just released a small .NET library called SharpNng https://t.co/myy0LNs2rX, a low-level wrapper around NNG, a Lightweight Messaging Library https://t.co/clsm5vuMJT 🤗
— Alexandre Mutel (@xoofx) November 20, 2021
サイト、ドキュメントなど
String.ReplaceLineEndings Method (System) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.string.replacelineendings?view=net-6.0
.NET 6 で追加された改行を一括置換するメソッド。プラットフォーム間で異なる改行を使用していることで混在してしまった場合に正規化するといったことが可能。ドキュメントではプロトコルパーサーなどでは使用しないことが推奨されている(例えば HTTP/1 は CRLF と決められている)。
改行として認識する文字は CR (U+000D), LF (U+000A), CRLF (U+000D U+000A), NEL (U+0085), LS (U+2028), FF (U+000C), PS (U+2029) となっている。
ツイート
ReSharper 2021.3 EAP9 is here with some last minute improvements for C# support. Give it a try: https://t.co/Sjxn3HzpeZ pic.twitter.com/rV1EgkGDH4
— JetBrains ReSharper (@resharper) November 22, 2021
Rider 2021.3 EAP9 is available! The major release is coming, builds are getting more stable, and C# support is improving. Try it: https://t.co/5BI4HI7lYX pic.twitter.com/RirEDfL4cF
— JetBrains Rider (@JetBrainsRider) November 22, 2021
ReSharper と Rider の 2021.3 EAP9 がリリースされたという話。
In EF Core 6.0, value converters allow converting nulls.
— Oleg Kyrylchuk (@okyrylchuk) November 22, 2021
It's useful when you have an enum with an unknown value, and it is represented as a nullable string column in a table.
⚠️ But watch out, there are pitfalls with it. Details below.#dotnet6 #efcore6 #coding #devcommunity pic.twitter.com/7Rqxhsd9AN
Entity Framework Core 6 で ValueConverter が null をサポートできるようになったという話。
Starting with EF Core 2.2, you could add a tag to your query for better debug purposes.
— Oleg Kyrylchuk (@okyrylchuk) November 26, 2021
EF Core 6.0 went further, and now you can tag queries with the filename and line number of the LINQ code.
Pretty cool, huh? 😎#dotnet6 #efcore6 #coding #devcommunity pic.twitter.com/XOfxfJgu9T
Entity Framework Core 6 では TagWithCallSite
を呼び出すことでクエリーのタグとしてファイル名と行番号を記録できるという話。
Previously, EF Core translated string.IsNullOrWhiteSpace into a trimming of value before checking if it's empty.@MarusykRoman has fixed that in EF Core 6.0🙂#dotnet6 #efcore6 #coding #devcommunity pic.twitter.com/J1DTIWKQxH
— Oleg Kyrylchuk (@okyrylchuk) November 24, 2021
Entity Framework Core のクエリーで String.IsNullOrWhitespace
を使用したときに発行される SQL に LTRIM
, RTRIM
が使用されていたが EF Core 6 ではそれらの呼び出しがなくなり、ただの空文字との比較となるという話。
これは SQL Server 向けの SQL トランスレーターの変更で SQL Server での文字列比較は文字列の長さが異なる場合は末尾にスペースをつけて長さを合わせての比較となる(ANSI/ISO SQL-92 に準拠した仕様)。そのため ' ' = ''
が等しいということになるのでトリムが不要となった。
- SqlServer: string.IsNullOrWhiteSpace translation is overly complex · Issue #22916 · dotnet/efcore
- SQL Server - 後ろにスペースがある場合の文字列の比較について - SQL Server 入門
GC realtime monitor is now available as a global .NET CLI tool thanks to @chnasarre! install via
— Maoni Stephens (@maoni0) November 20, 2021
dotnet tool install -g dotnet-gcmon
very much appreciated, Christophe!!!
リアルタイムで GC の動作を確認できる dotnet-gcmon というツールがリリースされているという話。
Deep Dive
Allow runtimeconfig StartupHooks and Environment StartupHooks to both be present by tomdegoede · Pull Request #61461 · dotnet/runtime
https://github.com/dotnet/runtime/pull/61461
.NET にはスタートアップ時に実行するアセンブリを指定するスタートアップフックという仕組みがあるが、runtimeconfig と環境変数のどちらかしか設定できないという問題を修正する PR。
Reduce allocations for CreateDirectory by adamsitnik · Pull Request #61777 · dotnet/runtime
https://github.com/dotnet/runtime/pull/61777
CreateDirectory メソッドの内部でシステム API を呼ぶ際 string を P/Invoke 経由で渡すのではなく、一時的なバイト配列を通して渡すことでアロケーションを削減する PR。
Add RateLimiting APIs by BrennanConroy · Pull Request #61788 · dotnet/runtime
https://github.com/dotnet/runtime/pull/61788
RateLimiting API を追加する PR。
XXHash64/32 incorrect one-shot implementation · Issue #61878 · dotnet/runtime
https://github.com/dotnet/runtime/issues/61878
.NET 6 とともにリリースされた System.IO.Hashing の xxHash32/64 のハッシュをとる静的メソッドが不正な結果を返すことがある問題の Issue。
これは修正されてバックポート済みのため近いうちに新しいパッケージとしてリリース予定。
Support zero-byte reads on HTTP response streams by MihaZupan · Pull Request #61913 · dotnet/runtime
https://github.com/dotnet/runtime/pull/61913
SocketsHttpHandler でゼロバイト読み込みをサポートしたいという Issue。
元々は gRPC の Bidirectional streaming のような長い接続の場合、ストリームから読み取るためのバッファーが各所にあり GC ヒープの断片化を起こしてしまう。ゼロバイト読み込みが可能となれば実際にデータが必要になるまで上位ではバッファーを持つ必要がなくなるという話。
- SocketsHttpHandler: Support zero-byte read on response streams · Issue #61475 · dotnet/runtime
- [HTTP/2] Memory usage while reading from long running response streams · Issue #61223 · dotnet/runtime
Added AsReadOnly extension methods for IDictionary<T, U> and IList<T> by Mrxx99 · Pull Request #61172 · dotnet/runtime
https://github.com/dotnet/runtime/pull/61172
IDictionary<T, U>
と IList<T>
に対する AsReadOnly
拡張メソッドを追加する PR。
MemoryStream.Read() throws ArgumentOutOfRangexception in .NET 6 but ArgumentException in .NET 5 · Issue #61994 · dotnet/runtime
https://github.com/dotnet/runtime/issues/61994
MemoryStream.Read
が .NET 5 までは ArgumentException
をスローしていたが、.NET 6 では ArgumentOutOfRangexception
になっていたという Issue。
ArgumentOutOfRangexception
は ArgumentException
を継承した型なので変更は問題ないと考えているとのこと。ただしテストコードなどで ArgumentException
を明示していると問題となることがある。
Add basic implementation of new rename UI by ryzngard · Pull Request #57686 · dotnet/roslyn
https://github.com/dotnet/roslyn/pull/57686
新しいリネームの UI の基本実装の PR。見た目は確定していないが今後実装される雰囲気をみることができる。