<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>.NET 11 | The .NET Blog</title><link>https://thedotnetblog.com/zh/tags/.net-11/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>zh</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 26 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/zh/tags/.net-11/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 11 终于修复了进程 API</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>System.Diagnostics.Process 迎来了多年来最大的更新。RunAndCaptureTextAsync、KillOnParentExit、SafeProcessHandle API，以及对标准句柄重定向的完全控制 — 再也不需要死锁样板代码了。</description><content:encoded>&lt;p&gt;每个曾经需要启动进程并捕获其输出的 .NET 开发者都写过某种变体的危险样板代码：异步读取 stdout、异步读取 stderr、&lt;code&gt;WaitForExitAsync&lt;/code&gt;，不要忘记排空两个流，否则会死锁。这是一个众所周知的陷阱，已经存在多年了。&lt;/p&gt;
&lt;p&gt;.NET 11 终于正确地解决了这个问题。&lt;/p&gt;
&lt;h2 id="runandcapturetextasync"&gt;RunAndCaptureTextAsync&lt;/h2&gt;
&lt;p&gt;核心新增：一个单一的静态方法，可以启动进程、捕获 stdout 和 stderr，并等待退出而不会死锁。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAndCaptureTextAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;--version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一次调用。无需手动排空流。无需精心放置的 &lt;code&gt;WaitForExit&lt;/code&gt;。如果你只需要运行某个命令并获取其输出，这就是你想要的 API。&lt;/p&gt;
&lt;p&gt;对于想要等待退出但不捕获输出的情况，还有 &lt;code&gt;Process.RunAsync&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="killonparentexit"&gt;KillOnParentExit&lt;/h2&gt;
&lt;p&gt;已启动进程的常见问题：如果父进程崩溃或被终止，子进程会作为孤儿继续运行。&lt;code&gt;KillOnParentExit&lt;/code&gt; 允许你在进程启动时声明，当父进程退出时子进程也应该被终止。&lt;/p&gt;
&lt;p&gt;这个功能以平台特定的方式存在过（Windows 上的 job objects，Linux 上的 prctl），但需要 p/invoke 或第三方库才能在 .NET 中使用。现在它是 &lt;code&gt;ProcessStartInfo&lt;/code&gt; 上的一等公民属性。&lt;/p&gt;
&lt;h2 id="基于-safeprocesshandle-的-api"&gt;基于 SafeProcessHandle 的 API&lt;/h2&gt;
&lt;p&gt;新的轻量级 API 表面是围绕 &lt;code&gt;SafeProcessHandle&lt;/code&gt; 而不是完整的 &lt;code&gt;Process&lt;/code&gt; 类构建的。完整的 &lt;code&gt;Process&lt;/code&gt; 类携带大量状态，难以裁剪 — &lt;code&gt;SafeProcessHandle&lt;/code&gt; 路径对于需要最小化输出大小的应用程序（WASM、原生 AOT）更加友好。&lt;/p&gt;
&lt;h2 id="对句柄继承的完全控制"&gt;对句柄继承的完全控制&lt;/h2&gt;
&lt;p&gt;此次更新还添加了对子进程继承哪些句柄以及如何重定向标准句柄的精细控制。以前你可以重定向 stdin/stdout/stderr，但无法在 OS 层面精确指定要继承哪些句柄。新 API 暴露了这种控制。&lt;/p&gt;
&lt;h2 id="为何重要"&gt;为何重要&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Process&lt;/code&gt; 类用于工具、构建系统、测试运行器以及任何调用其他可执行文件的应用程序。旧的 API 表面可以追溯到 .NET Framework，已经显示出老化的迹象。这不是破坏性变更 — 旧 API 仍然有效 — 但新代码应该优先使用新表面。&lt;/p&gt;
&lt;p&gt;对于裁剪的应用程序或 AOT 编译场景，&lt;code&gt;SafeProcessHandle&lt;/code&gt; 路径特别受欢迎。旧的 &lt;code&gt;Process&lt;/code&gt; 类带来了大量反射繁重的代码，使得裁剪变得复杂。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href="https://devblogs.microsoft.com/dotnet/process-api-improvements-in-dotnet-11/"&gt;Process API Improvements in .NET 11&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>.NET 11 Preview 4: 模板 MCP 服务器、Runtime-Async 库、进程 API</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/dotnet-11-preview-4-mcp-template-runtime-async-process-api/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/dotnet-11-preview-4-mcp-template-runtime-async-process-api/</guid><description>.NET 11 Preview 4 已发布。重点内容：SDK 中的 MCP 服务器模板、使用 runtime-async 编译的运行时库、用于移动端的 dotnet watch，以及进程 API 的重大扩展。</description><content:encoded>&lt;p&gt;.NET 11 Preview 4 已发布。每次 .NET 主要预览版的发布都会在运行时、SDK、库、ASP.NET Core、MAUI、C# 和 Entity Framework 中添加大量条目。与其重复完整列表，这里是让我眼前一亮的内容。&lt;/p&gt;
&lt;h2 id="mcp-服务器模板进入-net-sdk"&gt;MCP 服务器模板进入 .NET SDK&lt;/h2&gt;
&lt;p&gt;最有趣的条目：SDK 中现在包含了 MCP 服务器项目模板。这意味着 &lt;code&gt;dotnet new mcp-server&lt;/code&gt;（或最终名称的命令）开箱即用。对于在 .NET 中构建 MCP 工具的开发者，这大大减少了启动摩擦。MCP 在平台工具链中的集成标志着生态系统的发展方向。&lt;/p&gt;
&lt;h2 id="使用-runtime-async-编译的运行时库"&gt;使用 Runtime-Async 编译的运行时库&lt;/h2&gt;
&lt;p&gt;运行时本身现在使用 runtime-async 功能编译其标准库。这是一个影响性能的内部更改——运行时中的 async 状态机变得更加高效。这里的意义不在于用户可见的 API 更改，而在于 runtime-async 已足够成熟，可以用于 BCL 本身，这是关于该功能成熟度的有力信号。&lt;/p&gt;
&lt;h2 id="jit-优化和硬件内置函数"&gt;JIT 优化和硬件内置函数&lt;/h2&gt;
&lt;p&gt;Preview 4 继续 JIT 工作。硬件内置函数和代码生成改进在这里发布——详细信息在运行时发布说明中。这类更改通常会在不修改代码的情况下提升密集计算循环的吞吐量。&lt;/p&gt;
&lt;h2 id="进程-api-扩展"&gt;进程 API 扩展&lt;/h2&gt;
&lt;p&gt;Preview 4 中 &lt;code&gt;System.Diagnostics.Process&lt;/code&gt; 有重大更新：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Process.RunAndCaptureTextAsync&lt;/code&gt; — 启动进程、捕获 stdout/stderr、等待退出，一次调用完成，无死锁风险&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KillOnParentExit&lt;/code&gt; — 父子进程之间的轻量级生命周期耦合&lt;/li&gt;
&lt;li&gt;基于 &lt;code&gt;SafeProcessHandle&lt;/code&gt; 的 API，对 trimmer 更友好&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你曾经编写过样板代码来捕获进程输出而不引起死锁（同时异步读取 stdout &lt;em&gt;和&lt;/em&gt; stderr），&lt;code&gt;RunAndCaptureTextAsync&lt;/code&gt; 就是你一直缺少的 API。&lt;/p&gt;
&lt;h2 id="用于-android-和-ios-的-dotnet-watch"&gt;用于 Android 和 iOS 的 dotnet watch&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dotnet watch&lt;/code&gt; 现在支持 .NET MAUI Android 和 iOS 项目的设备选择。无需在构建循环中手动管理设备连接，即可更快地在移动端迭代。&lt;/p&gt;
&lt;h2 id="基于-span-的压缩-api"&gt;基于 Span 的压缩 API&lt;/h2&gt;
&lt;p&gt;新的基于 span 的 Deflate、ZLib 和 GZip 编码器/解码器 API 加入库中。处理压缩数据时减少分配——如果你在进行高吞吐量数据处理，这一点很有意义。&lt;/p&gt;
&lt;h2 id="试用"&gt;试用&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;下载 .NET 11 Preview 4&lt;/a&gt; — 这是预览版，尚未准备好用于生产，但值得在项目中运行以在 RC 周期之前尽早发现问题。&lt;/p&gt;
&lt;p&gt;原始文章：&lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-11-preview-4/"&gt;.NET 11 Preview 4 is now available!&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>