業界ニュース

LeadByExample():Jakub氏、プラグマティック・エンジニアリング、YOLOマインドセット、ベストプラクティスが必ずしもベストではない理由について語る

.NET 11の第4プレビューが利用可能になり、ライブラリアーサーや.NETサービスを本番で運用するチームにとって重要な影響を及ぼす複数の変更をもたらします。 Iron Softwareでは、.NETライブラリのポートフォリオを管理しており、各プレビューリリースが公開されるたびに、我々が管理者としてどのように変わるか、お客様がこれらのライブラリを自分たちのアプリケーションに統合するに際してどのように変わるかを二重に評価します。 以下は、プレビュー4で最も重要な更新だと考えているものです。

プロセスAPI: 数年間で最も重要な更新

System.Diagnostics.Processは、いくつかのリリースサイクル内での最初の重要なアップデートを受け取り、ライブラリ作成者が長年にわたり回避策を講じてきた箇所に正確に対処します。 これは直接的に我々の仕事に関連しています。 IronPDFはChromiumレンダリングプロセスを内部にラップしており、そのため我々のチームは、Microsoftが今標準化した領域にわたって、カスタムソリューションを構築し、維持してきました:プロセスの生成、デッドロックフリーの出力取得、クロスプラットフォームの生存期間管理、そして信頼性の高い終了動作。

新しいAPIサーフィスは、ライブラリチームが長年にわたって回避してきた問題のカタログのように読み取れます:

// One-line execution with no deadlock risk
string output = await Process.RunAndCaptureTextAsync("git", ["log", "-5"]);

// Cross-platform parent-exit behavior
var psi = new ProcessStartInfo("renderer.exe")
{
    KillOnParentExit = true,
};
// One-line execution with no deadlock risk
string output = await Process.RunAndCaptureTextAsync("git", ["log", "-5"]);

// Cross-platform parent-exit behavior
var psi = new ProcessStartInfo("renderer.exe")
{
    KillOnParentExit = true,
};
Imports System.Diagnostics
Imports System.Threading.Tasks

' One-line execution with no deadlock risk
Dim output As String = Await Process.RunAndCaptureTextAsync("git", {"log", "-5"})

' Cross-platform parent-exit behavior
Dim psi As New ProcessStartInfo("renderer.exe") With {
    .KillOnParentExit = True
}
$vbLabelText   $csharpLabel

RunAndCaptureTextAsyncはstdoutとstderrを多重化して、パイプバッファーデッドロックを排除します。 KillOnParentExitとStartDetachedは、WindowsおよびLinuxでの子プロセスのライフタイムをクロスプラットフォームで制御します。 InheritedHandlesは、子プロセスが継承するハンドルを明示的に指定できるようにし、従来の広範な継承のデフォルトを置き換えます。 軽量なSafeProcessHandleサーフィスは、標準APIよりも最大20%小さいNativeAOTバイナリを生成します。

子プロセスをオーケストレーションする.NETソフトウェアを構築するチームにとって、このリリースノートのセクションは注意深くレビューする価値があります。

このインフラストラクチャを内部で構築および維持したくないチーム向けに、IronPDFはこれらのパターンの本番テスト済みの実装を箱から取り出して提供します:デッドロックフリーの出力取得、ライフタイム制御、信頼性のある失敗処理。 Iron Suiteの無料トライアルを始める、クレジットカードは必要ありません。

スパンベースのDeflate、ZLib、およびGZip API

この変更はリリースノートであまり目立ちませんが、圧縮データを処理するあらゆるワークロードを実質的に改善します。 PDFドキュメントは圧縮されたコンテンツストリームを含んでいます。 XLSXファイルは圧縮されたXMLのZIPアーカイブです。 DOCXも同じパターンに従います。 新しいスパンベースのエンコーダーとデコーダーAPIは、IronPDFIronXLなど、ライブラリが継続的に実行するオペレーションにわたってアロケーションを削減します。

これらは通常リリースの見出しに載らないインフラストラクチャレベルの改善ですが、フレームワークで処理される各バイトのコストを削減します。

ランタイム非同期、今やフレームワークライブラリにコンパイルされています

プレビュー3では、Runtime Asyncのプレビュー機能ゲートが削除されました。 プレビュー4はこれをさらに拡張します:ランタイムライブラリ自体(BCL全体、System.IOやSystem.Net.Httpを含む)が、ランタイム非同期でコンパイルされます。 フレームワークへのすべての非同期呼び出しは、新しい継続マシナリーを使用します、消費しているコードがこの機能を有効にしているかどうかに依存せず。

大量のI/Oを実行するライブラリ(ファイルを読み込む、リモートアセットをダウンロードする、コーデックを通じてバイトをストリーミングする)にとって、これは消費者側の変更を要求せずに依存関係のパフォーマンスを意味のあるものへと改善します。 ランタイムチームのAndy Gockeは手動で有効化されたDecompressAsyncがMemoryStreamによってサポートされるときに追加のアロケーションを生じさせないことを確認しました。 Microsoftはまだ公式のベンチマーク数値を発表していませんが、完全なパフォーマンステストスイートを完了する必要があると述べていますが、構造的な変更は既に進行中です。

MAUIがCoreCLRに移行

これはリリースでの最も重要なアーキテクチャ変更ですが、我々の製品ラインに対する直接的な影響は限定的です。 プレビュー4から、Android、iOS、Mac Catalyst上のMAUIアプリケーションはデフォルトでCoreCLRで実行され、.NETのモバイルランタイムとしてMonoが15年以上にわたって続いたのが終了します。 同じランタイムが今やASP.NET Core、デスクトップアプリケーション、モバイルを動かしています。dotnet watchも今やAndroidおよびiOSで利用可能となり、初回リリース以来、MAUI開発者体験で最も頻繁に挙げられるギャップの1つを埋めます。

IronBarcodeIronPDFをMAUIアプリケーション内で使用しているチーム向けに、基礎となるランタイムは.NETスタックの残りと統合されています。

既知の制限と考慮事項

  • Visual StudioのサポートはInsidersチャネルに限られています。 安定したVisual Studioリリースにあるチームは、まだ.NET 11をメインライン開発に統合していません。
  • ランタイム非同期が構造的に着地しましたが、公式のベンチマークはありません。 "10Mのawaits: 80msから32msへ、687MBから94KBへ"という広く流布している数値は、Microsoftではなくコミュニティのgistから発信されています。
  • MAUI CoreCLR移行はデフォルトとして出荷されるランタイム変更です。 既存のMAUIアプリケーションは、透明なアップグレードであると仮定するのではなく、物理デバイスでテストする必要があります。
  • いかなるプレビューでも、少なくとも最初のリリース候補まで本番配備は待つべきです。

まとめ

プレビュー4は.NET 11サイクルのこれまでの最強の変更セットを表しています。 プロセスAPIの書き直しは、子プロセスを生成するまたは運用する.NETソフトウェアを構築または運営するチームにとって最も重要な更新です。 圧縮とランタイム非同期の改善は、I/O集約ワークロードにまたがって合わさります。 MAUIランタイムストーリーはプラットフォームの残りと一貫しています。

我々のチームは各プレビューを積極的に追跡し、.NET 11が11月に一般提供に到達するときには初日の互換性を図るために我々のライブラリを準備しています。