<?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/ru/tags/.net-11/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ru</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/ru/tags/.net-11/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 11 наконец исправляет API процессов</title><link>https://thedotnetblog.com/ru/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/ru/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>System.Diagnostics.Process получает самое большое обновление за годы. RunAndCaptureTextAsync, KillOnParentExit, API SafeProcessHandle и полный контроль над перенаправлением стандартных дескрипторов — больше никакого шаблонного кода для deadlock.</description><content:encoded>&lt;p&gt;Каждый .NET-разработчик, которому когда-либо нужно было запустить процесс и захватить его вывод, написал какую-то вариацию одного и того же опасного шаблонного кода: асинхронное чтение из stdout, асинхронное чтение из stderr, &lt;code&gt;WaitForExitAsync&lt;/code&gt;, не забыть очистить оба потока, иначе будет deadlock. Это хорошо известная ловушка, которая существует уже много лет.&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, и ожидает завершения без deadlock.&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;Это функциональность, которая существовала в платформо-специфических формах (job objects на Windows, prctl на Linux), но требовала p/invoke или сторонних библиотек для использования из .NET. Теперь это полноценное свойство на &lt;code&gt;ProcessStartInfo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="api-на-основе-safeprocesshandle"&gt;API на основе SafeProcessHandle&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, native AOT).&lt;/p&gt;
&lt;h2 id="полный-контроль-над-наследованием-дескрипторов"&gt;Полный контроль над наследованием дескрипторов&lt;/h2&gt;
&lt;p&gt;Обновление также добавляет детальный контроль над тем, какие дескрипторы наследует дочерний процесс и как перенаправляются стандартные дескрипторы. Ранее можно было перенаправлять stdin/stdout/stderr, но нельзя было указать точно, какие дескрипторы наследовать на уровне ОС. Новые 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/ru/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/ru/news/emiliano-montesdeoca/dotnet-11-preview-4-mcp-template-runtime-async-process-api/</guid><description>.NET 11 Preview 4 вышел. Ключевые моменты: шаблон MCP-сервера в SDK, библиотеки времени выполнения, скомпилированные с runtime-async, dotnet watch для мобильных устройств и значительное расширение API процессов.</description><content:encoded>&lt;p&gt;.NET 11 Preview 4 доступен. Каждый выпуск основной предварительной версии .NET добавляет длинный список изменений в runtime, SDK, библиотеки, ASP.NET Core, MAUI, C# и Entity Framework. Вместо повторения полного списка, вот что привлекло моё внимание.&lt;/p&gt;
&lt;h2 id="шаблон-mcp-сервера-в-sdk-net"&gt;Шаблон MCP-Сервера в SDK .NET&lt;/h2&gt;
&lt;p&gt;Самый интересный элемент: в SDK теперь включён шаблон проекта MCP-сервера. Это означает, что &lt;code&gt;dotnet new mcp-server&lt;/code&gt; (или как в итоге будет называться команда) работает из коробки. Для тех, кто создаёт MCP-инструменты в .NET, это значительно снижает начальную нагрузку. Интеграция MCP в инструментальную цепочку платформы сигнализирует о направлении развития экосистемы.&lt;/p&gt;
&lt;h2 id="библиотеки-runtime-скомпилированные-с-runtime-async"&gt;Библиотеки Runtime, Скомпилированные с Runtime-Async&lt;/h2&gt;
&lt;p&gt;Сам runtime теперь компилирует стандартные библиотеки с использованием функции runtime-async. Это внутреннее изменение, влияющее на производительность — машины состояний async в runtime становятся более эффективными. Значимость здесь не в видимых изменениях API; это то, что runtime-async достаточно зрел, чтобы использоваться для самой BCL, что является значимым сигналом о готовности функции.&lt;/p&gt;
&lt;h2 id="оптимизации-jit-и-аппаратные-интринсики"&gt;Оптимизации JIT и Аппаратные Интринсики&lt;/h2&gt;
&lt;p&gt;Preview 4 продолжает работу с JIT. Здесь поставляются улучшения аппаратных интринсиков и генерации кода — подробности в примечаниях к выпуску runtime. Такие изменения обычно улучшают пропускную способность в плотных вычислительных циклах без изменений в вашем коде.&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;API на основе &lt;code&gt;SafeProcessHandle&lt;/code&gt;, более совместимые с триммером&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="dotnet-watch-для-android-и-ios"&gt;dotnet watch для Android и iOS&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dotnet watch&lt;/code&gt; теперь поддерживает выбор устройства для проектов .NET MAUI Android и iOS. Более быстрая итерация на мобильных устройствах без ручного управления подключениями устройств в цикле сборки.&lt;/p&gt;
&lt;h2 id="api-сжатия-на-основе-span"&gt;API Сжатия на Основе Span&lt;/h2&gt;
&lt;p&gt;В библиотеки добавляются новые API кодирования/декодирования Deflate, ZLib и GZip на основе span. Меньше аллокаций при работе со сжатыми данными — актуально для высокопроизводительной обработки данных.&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; — это предварительная версия, не готовая к production, но стоит запустить её против ваших проектов, чтобы обнаружить проблемы до начала цикла 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>