Трекер .NET 11
Одна закладка на весь цикл .NET 11.
Эта подборка собирает всё, что я писал о .NET 11: preview-версии, изменения в рантайме, обновления GC, работа JIT и новый API в BCL. Добавьте страницу в закладки - я буду поддерживать её актуальной с каждой новой preview.
С чего начать
Если вы только знакомитесь с .NET 11, начните со статей с тегом “.net 11 preview” в верхней части списка. Каждая освещает ключевые моменты одной preview. Более старые статьи остаются полезными, потому что набор возможностей .NET 11 накапливается.
Что на этой странице
Таблица ниже автоматически собирается из статей с одним из тегов: .net 11, dotnet 11, .net 11 preview, dotnet, .net. Еженедельный задачник переупорядочивает её так, чтобы свежие материалы всплывали наверх.
Если вам нужна быстрая шпаргалка вместо хронологической подборки, посмотрите сопутствующие подборки “EF Core 11 cheat sheet” и “Возможности C# 14” в индексе /pillars/.
Указатель (164 статей)
2026 / 05
- .NET 11 добавляет захват вывода процессов без взаимных блокировок
.NET 11 Preview 4 представляет новые API System.Diagnostics.Process, которые параллельно вычитывают stdout и stderr, плюс однострочные хелперы запуска с захватом и KillOnParentExit.
- Исправление: сборка Gradle не смогла создать файл .apk в MAUI Android
В девяти случаях из десяти настоящая ошибка Gradle спрятана выше в логе MSBuild. Путь к JDK 17, отсутствующий workload maui-android и длинные пути в Windows -- обычные первопричины.
- Fix: A possible object cycle was detected
System.Text.Json отказывается сериализовать графы с обратными ссылками. Установите ReferenceHandler.IgnoreCycles, спроецируйте на DTO или пометьте обратный указатель атрибутом [JsonIgnore]. Preserve - крайнее средство.
- Исправление: SqlException: Timeout expired при миграциях EF Core
Миграции используют DbContext времени проектирования, а не ваш CommandTimeout времени выполнения. Установите таймаут через UseSqlServer(o => o.CommandTimeout(...)), Command Timeout в строке подключения или Database.SetCommandTimeout перед Migrate().
- Исправление: System.Text.Json.JsonException: The JSON value could not be converted
System.Text.Json выбрасывает это исключение, когда входящий JSON-токен не соответствует целевому типу CLR. Согласуйте JSON с типом или зарегистрируйте JsonConverter или JsonSerializerOption, которые их связывают.
- Исправление: System.Security.Cryptography.CryptographicException: Keyset does not exist
Закрытый ключ сертификата лежит в отдельном файле ключей Windows, который текущий процесс не может прочитать. Настройте ACL, загрузите PFX с MachineKeySet или используйте EphemeralKeySet.
- Исправление: The command 'dotnet' could not be found в CI
Раннер CI не может найти dotnet, потому что SDK не установлен на этом шаге, либо установлен, но не в PATH. Используйте actions/setup-dotnet, зафиксируйте global.json и экспортируйте DOTNET_ROOT и ~/.dotnet/tools.
- Исправление: System.IO.FileNotFoundException: Could not load file or assembly в опубликованном приложении
Работает с dotnet run, падает после dotnet publish. DLL обычно отсутствует в папке публикации, а не в среде выполнения. Проверьте deps.json, Private у ProjectReference и trimming.
- Исправление: InvalidOperationException: Synchronous operations are disallowed
Замените вызов Stream.Read или Write на ReadAsync/WriteAsync. В крайнем случае установите AllowSynchronousIO в Kestrel, IIS или поштучно через IHttpBodyControlFeature.
- Fix: RZ10012: Found markup element with unexpected name в Blazor
Компилятор Razor в Blazor выдаёт RZ10012, когда тег в PascalCase не связан с типом компонента в области видимости. Добавьте @using для пространства имён компонента в _Imports.razor или @namespace в самом компоненте, затем пересоберите проект.
- Fix: dotnet ef migrations add падает с 'Unable to create an object of type DbContext'
Инструменты EF Core времени проектирования не смогли создать экземпляр вашего DbContext. Предоставьте host через WebApplication.CreateBuilder, укажите правильный startup project или реализуйте IDesignTimeDbContextFactory.
- Fix: MSB3027 Could not copy X to Y. Exceeded retry count of 10. Failed
MSB3027 означает, что MSBuild десять раз пытался скопировать файл, а процесс по-прежнему удерживал место назначения. Завершите блокирующий процесс, исключите bin/obj из антивируса или повысьте CopyRetryCount.
- Fix: The type or namespace name 'X' could not be found (после добавления ProjectReference)
CS0246 сразу после свежей ProjectReference почти всегда означает несовпадение TargetFramework, устаревшую папку obj/ или отсутствующую директиву using. Пять решений по убыванию вероятности.
- Решение: Cannot consume scoped service 'X' from singleton 'Y'
Валидация области в ASP.NET Core выбрасывает это, когда singleton захватил бы scoped-зависимость на весь процесс. Сделайте потребителя scoped или внедрите IServiceScopeFactory и создавайте область по требованию.
- Fix: PlatformNotSupportedException: Operation is not supported on this platform в Native AOT
Native AOT убирает JIT и интерпретатор, поэтому reflection emit, компиляция деревьев выражений и невиденные MakeGenericType бросают во время выполнения. Найдите вызов через IL3050 и замените его на генератор исходного кода или заранее подготовленный путь.
- Исправление: Unable to resolve service for type 'X' while attempting to activate 'Y'
ASP.NET Core выбрасывает это исключение, когда конструктор запрашивает тип, который никогда не был зарегистрирован, был зарегистрирован в другом контейнере или был добавлен после построения хоста. Три конкретных исправления покрывают почти все случаи.
- Исправление: TaskCanceledException: A task was canceled в HttpClient
HttpClient выбрасывает TaskCanceledException по трём разным причинам: таймаут, отмена со стороны вызывающего кода или прерывание на уровне соединения. Различайте их с помощью InnerException и CancellationToken.IsCancellationRequested и устраняйте именно ту, что нужно.
- Обновление Copilot Studio до .NET 10 WebAssembly: 20% на холодном пути, 5% на горячем
Microsoft перевела WASM-движок Copilot Studio с .NET 8 на .NET 10. Двойной пакет JIT/AOT, fingerprinting и WasmStripILAfterAOT объясняют цифры.
- Fix: The JSON value could not be converted to System.DateTime
System.Text.Json принимает для DateTime только строки в ISO 8601. Отправляйте 2026-05-08T14:00:00Z или зарегистрируйте JsonConverter, разбирающий ваш формат. Пустые строки и Unix-таймстампы тоже бросают исключение.
- Workflow в Microsoft Agent Framework теперь переживают перезапуск процесса благодаря стеку Durable Task
Оберните Workflow Agent Framework в Microsoft.Agents.AI.DurableTask, и каждый шаг исполнителя получает чекпоинт. Падение, передеплой, перезапуск: запуск продолжится с того же места.
- Исправление: The instance of entity type cannot be tracked because another instance with the same key value is already being tracked
EF Core 11 выбрасывает это исключение, когда два объекта делят первичный ключ внутри одного DbContext. Отсоедините старый или обновите его на месте. AsNoTracking при чтении предотвращает коллизию.
- Исправление: A second operation was started on this context instance before a previous operation completed
EF Core выбрасывает это исключение, когда два await выполняются параллельно на одном DbContext. Ожидайте каждый вызов последовательно или получайте новый DbContext на каждую конкурентную единицу работы через IDbContextFactory.
- Миграция высокопроизводительного Xamarin.Forms ListView на MAUI CollectionView
Пошаговая миграция с Xamarin.Forms 5.0 ListView на .NET MAUI 11 CollectionView для приложений, в которых уже выжимали максимум производительности из ListView. Рассмотрены переиспользование ячеек, виртуализация, группировка, pull-to-refresh, контекстные действия, выделение, ItemsLayout, EmptyView и подводные камни, которые встречаются в реальных приложениях.
- Microsoft Agent Framework пропускает рискованные вызовы инструментов через FunctionApprovalRequestContent
Оберните AIFunction в ApprovalRequiredAIFunction, и агент остановится посреди выполнения, чтобы запросить разрешение. Вот как работает поток запроса и ответа в C#.
- Исправление: System.InvalidOperationException: No connection string named 'DefaultConnection' could be found
Если GetConnectionString возвращает null в .NET 11, в вашем appsettings.json нет ключа, файл не копируется в выходной каталог сборки или выбран не тот файл окружения. Три проверки решают 95% случаев.
- Как преобразовать T[] в ReadOnlyMemory<T> в C# (неявный оператор и явный конструктор)
Три способа обернуть T[] в ReadOnlyMemory<T> в .NET 11: неявное преобразование, явный конструктор и AsMemory(). Когда что выбрать.
- Agent Governance Toolkit ставит YAML-политику перед каждым вызовом MCP-инструмента из .NET
Новый пакет Microsoft.AgentGovernance от Microsoft оборачивает вызовы MCP-инструментов ядром политик, сканером безопасности и санитайзером ответов. Вот что делает каждая часть и как это подключается на C#.
- Как настроить структурированное журналирование с Serilog и Seq в .NET 11
Полное руководство по подключению Serilog 4.x и Seq 2025.2 к приложению .NET 11 ASP.NET Core: AddSerilog против UseSerilog, двухэтапное журналирование при старте, конфигурация через JSON, обогатители, журналирование запросов, корреляция трассировок OpenTelemetry, API-ключи и продакшн-нюансы вокруг буферизации, хранения и уровня сигнала.
- Как использовать OpenTelemetry с .NET 11 и бесплатным бэкендом
Подключите трейсы, метрики и логи OpenTelemetry в приложение ASP.NET Core .NET 11 через OTLP-экспортёр и отправляйте данные на бесплатный самохостинг-бэкенд: standalone Aspire Dashboard для локальной разработки, Jaeger и SigNoz для самохостинговой продакшн-среды и OpenTelemetry Collector, когда нужны и тот и другой.
- Как писать интеграционные тесты против настоящего SQL Server с помощью Testcontainers
Полное руководство по запуску интеграционных тестов ASP.NET Core против настоящего SQL Server 2022 с использованием Testcontainers 4.11 и EF Core 11: настройка WebApplicationFactory, IAsyncLifetime, подмена регистрации DbContext, применение миграций, параллелизм, очистка через Ryuk и подводные камни CI.
2026 / 04
- Claude Code 2.1.122 позволяет выбрать уровень сервиса Bedrock через переменную окружения
Claude Code v2.1.122 добавляет переменную окружения ANTHROPIC_BEDROCK_SERVICE_TIER, отправляемую как заголовок X-Amzn-Bedrock-Service-Tier. Установите flex для скидки 50 процентов на вызовы агента или priority для более быстрых ответов, без изменений кода SDK.
- Как добавить ограничение скорости для отдельных endpoint в ASP.NET Core 11
Полное руководство по ограничению скорости (rate limiting) для отдельных endpoint в ASP.NET Core 11: когда выбирать fixed window против sliding window, token bucket или concurrency, чем отличаются RequireRateLimiting и [EnableRateLimiting], партиционирование по пользователю или IP, callback OnRejected и ловушка распределённого развёртывания, в которую попадают все.
- Как использовать новый тип System.Threading.Lock в .NET 11
System.Threading.Lock появился в .NET 9 и стал стандартной примитивой синхронизации в .NET 11 и C# 14. Это руководство показывает, как мигрировать с lock(object), как работает EnterScope и какие подводные камни связаны с await, dynamic и поддержкой старых таргетов.
- Как написать генератор исходного кода для INotifyPropertyChanged
Полное руководство по созданию собственного инкрементального генератора исходного кода для INotifyPropertyChanged в C# 14 и .NET 11: пайплайн IIncrementalGenerator, маркерные атрибуты, вывод partial class, паттерн SetProperty и как оставаться совместимым с AOT.
- Как определить, что запись файла в .NET завершена
FileSystemWatcher срабатывает на Changed до того, как писатель закончил. Три надёжных паттерна для .NET 11, чтобы узнать, что файл полностью записан: открытие с FileShare.None, дебаунс по стабилизации размера и трюк с переименованием на стороне продьюсера, который полностью устраняет проблему.
- Как правильно использовать SearchValues<T> в .NET 11
SearchValues<T> обгоняет IndexOfAny в 5-250 раз, но только если использовать его так, как ожидает среда выполнения. Правило кеширования через static, ловушка StringComparison, когда не стоит и недокументированный трюк инверсии через IndexOfAnyExcept.
- SkiaSharp 4.0 Preview 1: неизменяемый SKPath, переменные шрифты и новый со-мейнтейнер
SkiaSharp 4.0 Preview 1 выходит вместе с Uno Platform в роли со-мейнтейнера рядом с командой .NET. SKPath становится неизменяемым за новым SKPathBuilder, а HarfBuzzSharp получает полное управление осями переменных шрифтов OpenType.
- Как загрузить большой файл потоком в Azure Blob Storage
Загружайте многогигабайтные файлы в Azure Blob Storage из .NET 11, не помещая их в память. BlockBlobClient.UploadAsync со StorageTransferOptions, MultipartReader для загрузок в ASP.NET Core, и ловушки буферизации, которые отправляют ваш payload на LOH.
- Как использовать Native AOT с минимальными API ASP.NET Core
Полное руководство для .NET 11 по выпуску минимального API ASP.NET Core с Native AOT: PublishAot, CreateSlimBuilder, JSON с генератором исходного кода, ограничение AddControllers, предупреждения IL2026 / IL3050 и EnableRequestDelegateGenerator для библиотечных проектов.
- Как добавить глобальный фильтр исключений в ASP.NET Core 11
Полное руководство по глобальной обработке исключений в ASP.NET Core 11: почему IExceptionFilter — неподходящий инструмент, как IExceptionHandler и UseExceptionHandler работают вместе, ответы ProblemDetails, цепочки из нескольких обработчиков и ломающее изменение в .NET 10 о подавлении диагностики.
- Как построить собственный MCP-сервер на C# в .NET 11
Постройте рабочий сервер Model Context Protocol на C# 14 / .NET 11, используя официальный SDK ModelContextProtocol 1.2. Рассмотрены транспорт stdio, атрибуты [McpServerTool], внедрение зависимостей, ловушка с журналированием в stderr и регистрация в Claude Code, Claude Desktop и VS Code.
- Как писать модульные тесты для кода, использующего HttpClient
Полное руководство по тестированию HttpClient в .NET 11: почему не стоит мокать HttpClient напрямую, как написать stub HttpMessageHandler, заменить primary handler через IHttpClientFactory, проверить повторы Polly и вариант WireMock.Net.
- Aspire 13.2.4 закрывает CVE-2026-40894: DoS через заголовок baggage в OpenTelemetry .NET
Aspire 13.2.4 поднимает зависимости OpenTelemetry для устранения CVE-2026-40894, усиления выделений в Gen0 при разборе пропагаторов baggage, B3 и Jaeger. Обновите OpenTelemetry.Api и OpenTelemetry.Extensions.Propagators до 1.15.3, даже если вы не используете Aspire.
- Как профилировать приложение .NET с помощью dotnet-trace и читать вывод
Полное руководство по профилированию приложений .NET 11 с dotnet-trace: установка, выбор подходящего профиля, захват с момента старта и чтение .nettrace в PerfView, Visual Studio, Speedscope или Perfetto.
- Как использовать Channels вместо BlockingCollection в C#
System.Threading.Channels это асинхронная замена BlockingCollection в .NET 11. В руководстве показано, как мигрировать, как выбирать между ограниченным и неограниченным каналом, и как обрабатывать backpressure, отмену и корректное завершение без deadlock-ов.
- Как написать пользовательский JsonConverter в System.Text.Json
Полное руководство по написанию пользовательского JsonConverter<T> для System.Text.Json в .NET 11: когда он действительно нужен, как корректно работать с Utf8JsonReader, как обрабатывать обобщённые типы с помощью JsonConverterFactory и как оставаться совместимым с AOT.
- .NET 10 на Ubuntu 26.04: resolute-теги контейнеров и Native AOT в archive
Ubuntu 26.04 Resolute Raccoon поставляется с .NET 10 в archive, вводит теги контейнеров -resolute вместо -noble и упаковывает инструментарий Native AOT через dotnet-sdk-aot-10.0.
- Как генерировать строго типизированный клиентский код из спецификации OpenAPI в .NET 11
Используйте Kiota, официальный генератор OpenAPI от Microsoft, для создания fluent-клиента на C# со строгой типизацией из любой спецификации OpenAPI. Пошагово: установка, генерация, подключение к DI в ASP.NET Core и настройка аутентификации.
- Как передавать файл из конечной точки ASP.NET Core без буферизации
Отдавайте большие файлы из ASP.NET Core 11, не загружая их в память. Три уровня: PhysicalFileResult для файлов на диске, Results.Stream для произвольных потоков и Response.BodyWriter для генерируемого контента -- с кодом для каждого случая.
- Как отменить долго работающую Task в C# без взаимной блокировки
Кооперативная отмена с CancellationToken, CancelAsync, Task.WaitAsync и связанными токенами в .NET 11. Плюс блокирующие паттерны, превращающие чистую отмену в дедлок.
- Как использовать IAsyncEnumerable<T> с EF Core 11
Запросы EF Core 11 напрямую реализуют IAsyncEnumerable<T>. Как стримить строки через await foreach, когда предпочесть его вместо ToListAsync, и подводные камни со соединениями, трекингом и отменой.
- .NET 10.0.7 выходит out-of-band, чтобы закрыть CVE-2026-40372 в ASP.NET Core Data Protection
Дефект валидации HMAC в Microsoft.AspNetCore.DataProtection 10.0.0 до 10.0.6 позволяет атакующим подделывать ciphertexts. .NET 10.0.7 - обязательный фикс.
- Debugger Agent в Visual Studio 18.5 превращает Copilot в живого напарника по охоте на баги
Visual Studio 18.5 GA поставляет гайдед workflow Debugger Agent в Copilot Chat, который формирует гипотезу, ставит breakpoints, едет вместе через repro, валидирует против runtime state и предлагает fix.
- Agent Skills приходят в Visual Studio 2026 18.5: Copilot автоматически находит SKILL.md в вашем репозитории
Visual Studio 2026 18.5.0 позволяет GitHub Copilot подгружать Agent Skills из .github/skills, .claude/skills и ~/.copilot/skills. Переиспользуемые пакеты инструкций SKILL.md путешествуют вместе с репозиторием.
- RyuJIT обрезает больше bounds checks в .NET 11 Preview 3: index-from-end и i + константа
.NET 11 Preview 3 учит RyuJIT убирать избыточные bounds checks в последовательных index-from-end обращениях и в паттернах i + константа < length, снижая давление branch в плотных циклах.
- RegexOptions.AnyNewLine приземляется в .NET 11 Preview 3: Unicode-aware anchors без хаков \r?
.NET 11 Preview 3 добавляет RegexOptions.AnyNewLine так, что ^, $, \Z и . распознают любую Unicode-последовательность newline, включая \r\n, NEL, LS и PS, с \r\n трактуемым как один атомарный разрыв.
- Aspire 13.2 --isolated: запускайте параллельные экземпляры AppHost без конфликтов портов
Aspire 13.2 поставляет флаг --isolated, дающий каждому aspire run свои случайные порты и store secrets. Разблокирует multi-checkout работу, worktree-агенты и интеграционные тесты, требующие живой AppHost.
- .NET 11 Preview 3: dotnet run -e задаёт переменные окружения без launch profiles
dotnet run -e в .NET 11 Preview 3 передаёт переменные окружения напрямую из CLI и поднимает их как MSBuild items RuntimeEnvironmentVariable.
- dotnet watch в .NET 11 Preview 3: Aspire-хосты, crash recovery и вменяемый Ctrl+C
dotnet watch получает интеграцию с Aspire app host, автоматический перезапуск после крашей и починенную обработку Ctrl+C для Windows desktop-приложений в .NET 11 Preview 3.
- Создание движка базы данных с микросекундной задержкой на C#
Проект Typhon Лоика Бауманна нацелен на ACID-коммиты за 1-2 микросекунды с использованием ref struct, аппаратных интринсиков и закреплённой памяти, доказывая, что C# может конкурировать на уровне системного программирования.
- Как дефолтные nvarchar-параметры Dapper молча убивают ваши индексы SQL Server
C#-строки, отправленные через Dapper, по умолчанию становятся nvarchar(4000), заставляя SQL Server выполнять implicit conversion и полные scan индекса. Вот как починить через DbType.AnsiString.
- GitHub Copilot Modernization: отчёт assessment и есть настоящий продукт
GitHub Copilot Modernization подаётся как цикл Assess, Plan, Execute для миграции legacy .NET-приложений. Фаза assessment - где живёт ценность: inventory-отчёт, категоризированные blockers, и file-level remediation guidance, которую можно diffать как код.
- Hot Reload auto-restart в Visual Studio 2026: rude edits перестают убивать debug-сессию
Visual Studio 2026 добавляет HotReloadAutoRestart, project-level opt-in, перезапускающий приложение, когда rude edit иначе завершил бы debug-сессию. Особенно полезно для проектов Razor и Aspire.
- EF Core 11 позволяет создать и применить миграцию одной командой
Команда dotnet ef database update теперь принимает --add для создания и применения миграции в одном шаге. Вот как это работает, почему это важно для контейнеров и .NET Aspire, и на что обратить внимание.
- EF Core 11 добавляет нативный векторный поиск SQL Server с индексами DiskANN
EF Core 11 Preview 2 поддерживает VECTOR_SEARCH() из SQL Server 2025 и векторные индексы DiskANN прямо из LINQ. Вот как настроить индекс, выполнять приближённые запросы, и что меняется по сравнению с подходом VectorDistance из EF Core 10.
- Rider 2026.1 поставляет просмотрщик ASM для вывода JIT, ReadyToRun и NativeAOT
Rider 2026.1 добавляет плагин .NET Disassembler, позволяющий инспектировать машинный код, генерируемый компиляторами JIT, ReadyToRun и NativeAOT, не покидая IDE.
- Union-типы C# 15 здесь: типы-объединения поставляются в .NET 11 Preview 2
C# 15 вводит ключевое слово union для типов-объединений с исчерпывающим сопоставлением с образцом и неявными преобразованиями. Доступно прямо сейчас в .NET 11 Preview 2.
- Kestrel отказывается от исключений в HTTP/1.1-парсере в .NET 11
Парсер HTTP/1.1-запросов Kestrel в .NET 11 заменяет BadHttpRequestException на структуру результата, сокращая накладные расходы на некорректные запросы до 40%.
- Microsoft Agent Framework 1.0: создание ИИ-агентов на чистом C#
Microsoft Agent Framework достигает 1.0 со стабильными API, мульти-провайдерными коннекторами, мульти-агентной оркестрацией и совместимостью A2A/MCP. Вот как это выглядит на практике в .NET 10.
2026 / 03
- Как на самом деле выглядят 878 PR Copilot Coding Agent в dotnet/runtime
Команда .NET делится десятью месяцами реальных данных по запуску GitHub Copilot Coding Agent в dotnet/runtime: 878 PR, коэффициент слияния 67,9% и чёткие уроки о том, где разработка с помощью ИИ помогает и где всё ещё не дотягивает.
- Generative AI for Beginners .NET v2: перестроен для .NET 10 с Microsoft.Extensions.AI
Бесплатный курс по генеративному ИИ для .NET-разработчиков от Microsoft выпускает Версию 2, перестроенную для .NET 10 и мигрированную с Semantic Kernel на шаблон IChatClient из Microsoft.Extensions.AI.
2026 / 02
- Идея для C# 14: интерцепторы могли бы сделать генерацию исходного кода System.Text.Json автоматической
Обсуждение в сообществе предложило использовать интерцепторы C# 14 для переписывания вызовов JsonSerializer, чтобы они автоматически использовали сгенерированный JsonSerializerContext, сохраняя AOT-совместимую генерацию исходного кода с более чистыми точками вызова.
- Polars.NET: движок DataFrame на Rust для .NET 10, опирающийся на LibraryImport
Новый проект Polars.NET в тренде после поста сообщества от 6 февраля 2026 года. Заголовок прост: дружественный к .NET API DataFrame, поддерживаемый Rust Polars, со стабильным C ABI и interop на основе LibraryImport, чтобы поддерживать низкие накладные расходы.
- .NET Framework 3.5 становится автономным в новых сборках Windows: что ломается
Начиная с Windows 11 Build 27965, .NET Framework 3.5 больше не является дополнительным компонентом Windows. Вот что ломается в CI, провижининге и эталонных образах, и как это исправить.
- TrailBase v0.23.7: альтернатива Firebase в одном бинарнике для .NET 10 и Flutter
TrailBase - это бэкенд с открытым исходным кодом в виде одного исполняемого файла, построенный на Rust, SQLite и Wasmtime. Версия 0.23.7 включает исправления UI и улучшенную обработку ошибок.
2026 / 01
- Спам запросов “become owner” в NuGet: что делать (и что закрыть) в .NET 9/.NET 10
Защитите свои .NET-пакеты от спама запросов на владение в NuGet. Lock-файлы, Package Source Mapping и практики Central Package Management для .NET 9 и .NET 10.
- Scalar в ASP.NET Core: почему ваш Bearer-токен игнорируется (.NET 10)
Если ваш Bearer-токен работает в Postman, но не в Scalar, проблема скорее всего в OpenAPI-документе. Как объявить корректную security-схему в .NET 10.
- TreatWarningsAsErrors без саботажа dev-сборок (.NET 10)
Как обеспечить TreatWarningsAsErrors в сборках Release и CI, оставив Debug гибким для локальной разработки на .NET 10, с помощью Directory.Build.props.
- Perfetto + dotnet-trace: практический цикл профилирования для .NET 9/.NET 10
Практический цикл профилирования для .NET 9 и .NET 10: захватывайте трассировки с помощью dotnet-trace, визуализируйте их в Perfetto и итеративно разбирайтесь с проблемами CPU, GC и пула потоков.
- Приложение заметок "только локально" на WinUI 3 - правильная скучность: offline-first, SQLite, упор на клавиатуру
Miyanyedi Quick Note - это приложение заметок на WinUI 3 + SQLite, offline-first и дружественное к приватности. Почему "только локально" - это фича, плюс минимальный SQLite-сниппет для десктопных приложений на .NET 8.
- Open-source SSH-менеджер на WPF показывает практичный шаблон: xterm.js в WebView2, секреты через DPAPI
SshManager - это open-source SSH-менеджер на WPF, построенный на .NET 8. Он показывает практичный шаблон: xterm.js внутри WebView2 для отрисовки терминала, EF Core + SQLite для хранения и DPAPI для защиты локальных учётных данных.
- CV Shortlist: SaaS на .NET 10 с ИИ стал open-source, и стек стоит изучить
CV Shortlist - это open-source SaaS на .NET 10, который сочетает Azure Document Intelligence с моделью OpenAI. Стек, дисциплина конфигурации и граница интеграции с ИИ заслуживают изучения.
- ModularPipelines V3: пишите CI-пайплайны на C#, отлаживайте локально и перестаньте нянчить YAML
ModularPipelines V3 позволяет писать CI-пайплайны на C# вместо YAML. Запускайте их локально через dotnet run, получайте безопасность времени компиляции и отлаживайте с точками останова.
- Разверните .NET-приложение с Podman + systemd: стабильные перезапуски, настоящие логи, без магии
Развёртывание сервисов .NET 9 и .NET 10 на Linux-VM с помощью Podman и systemd. Стабильные перезапуски, настоящие логи через journald и контейнеризированное приложение, управляемое как полноценный сервис -- без Kubernetes.
- gRPC в контейнерах кажется сложным в .NET 9 и .NET 10: 4 ловушки, которые можно исправить
Четыре частые ловушки при размещении gRPC в контейнерах с .NET 9 и .NET 10: несовпадение протокола HTTP/2, путаница с терминацией TLS, сломанные health-проверки и неверная настройка прокси -- с исправлением для каждой.
- Microsoft `mcp`: подключаем серверы Model Context Protocol на C# в .NET 10
Как подключить серверы Model Context Protocol (MCP) на C# в .NET 10 с помощью microsoft/mcp. Контракты инструментов, валидация ввода, аутентификация, наблюдаемость и шаблоны для продакшна.
- Мониторинг фоновых задач в .NET 9 и .NET 10 без Hangfire: здоровье + метрики + оповещения
Мониторинг задач BackgroundService в .NET 9 и .NET 10 без Hangfire с помощью heartbeat-проверок здоровья, метрик длительности и оповещений о сбоях, с практическим примером кода.
- Файловые приложения .NET 10 получили скрипты из нескольких файлов: на подходе `#:include`
.NET 10 добавляет поддержку #:include для файловых приложений, позволяя скриптам, запускаемым через dotnet run, охватывать несколько .cs файлов без создания полноценного проекта.
- SBOM для .NET в Docker: перестаньте пытаться заставить один инструмент видеть всё
Как отслеживать зависимости NuGet и пакеты ОС контейнера для Docker-образа .NET с помощью CycloneDX, Syft и Dependency-Track -- и почему одного SBOM недостаточно.
- System.CommandLine v2, но с уже готовой обвязкой: `Albatross.CommandLine` v8
Albatross.CommandLine v8 строится поверх System.CommandLine v2 и добавляет генератор исходного кода, интеграцию с DI и слой хостинга, чтобы убрать шаблонный код CLI в приложениях .NET 9 и .NET 10.
- Wave-IDE в 2026: минимальная обвязка Roslyn под IDE на WinForms на .NET 10
Wave-IDE показывает, что WinForms и Roslyn на .NET 10 - это уже достаточно, чтобы построить рабочий C#-IDE. Вот минимальная обвязка для инкрементального анализа, автодополнения и диагностики.
- AWS Lambda поддерживает .NET 10: что проверить перед переключением среды выполнения
AWS Lambda теперь поддерживает .NET 10, но обновление среды выполнения это не самая сложная часть. Вот практический чек-лист, охватывающий cold starts, trimming, native AOT и форму развёртывания.
- .NET 10 раздул ваш список NIC? Фильтрация GetAllNetworkInterfaces() без самообмана
Как фильтровать GetAllNetworkInterfaces() в .NET 10, когда виртуальные адаптеры из Hyper-V, Docker, WSL и VPN затопляют список. Включает двухступенчатый фильтр с явными компромиссами.
- Queryable Encryption и векторный поиск в провайдере MongoDB EF Core (и почему это важно для .NET 9 и .NET 10)
Провайдер MongoDB EF Core теперь поддерживает Queryable Encryption и векторный поиск. Что это значит для приложений на .NET 9 и .NET 10, уже использующих EF Core.
- SwitchMediator v3: медиатор без аллокаций, который остаётся дружелюбным к AOT
SwitchMediator v3 нацелен на бесаллокационный, AOT-дружественный диспатч для CQRS-сервисов на .NET 9 и .NET 10. Что это значит и как замерить собственный медиатор.
- Производительность .NET 10: SearchValues
Используйте SearchValues в .NET 10 для высокопроизводительного поиска по нескольким строкам. Заменяет циклы foreach на сопоставление, ускоренное SIMD, с алгоритмами Aho-Corasick и Teddy.
- Стриминг задач с Task.WhenEach в .NET 9
.NET 9 представляет Task.WhenEach, возвращающий IAsyncEnumerable задач по мере их завершения. Вот как это упрощает обработку параллельных результатов по мере поступления.
- C# 13: конец выделениям `params`
C# 13 наконец устраняет скрытое выделение массива за params. Теперь params можно использовать со Span, ReadOnlySpan, List и другими типами коллекций для вариадических методов без выделений.
- .NET 9: конец lock(object)
В .NET 9 появилась System.Threading.Lock -- выделенная лёгкая примитива синхронизации, заменяющая lock(object) лучшей производительностью и более ясным намерением.
- Оптимизация подсчёта частот с LINQ CountBy
Замените GroupBy на CountBy в .NET 9 ради более чистого и эффективного подсчёта частот. Снижает выделения с O(N) до O(K), пропуская промежуточные структуры группировки.
2025 / 04
- .NET 10: размещение массивов value-типов на стеке
В .NET 10 JIT может размещать на стеке небольшие массивы фиксированного размера из value-типов, исключая выделение памяти в куче и обеспечивая до 60% прироста производительности по сравнению с .NET 9.
- Что нового в .NET MAUI 10
Краткий обзор новых возможностей, улучшений и обратно несовместимых изменений в .NET MAUI 10, выпущенном вместе с .NET 10 и C# 14 в ноябре 2025 года.
- Как изменить цвет иконки SearchBar в .NET MAUI
Как изменить цвет иконки SearchBar в .NET MAUI с помощью нового свойства SearchIconColor, появившегося в .NET 10.
- C# 14: упрощённые параметры с модификаторами в лямбдах
В C# 14 модификаторы ref, out, in, scoped и ref readonly можно применять к лямбда-параметрам с неявно выводимыми типами, что избавляет от необходимости явно указывать типы параметров.
- Partial-конструкторы и события в C# 14
C# 14 позволяет объявлять конструкторы экземпляров и события как partial-члены, разделяя определения между файлами для более чистой генерации кода и разделения ответственности.
- C# 14: поддержка nameof для несвязанных универсальных типов
C# 14 расширяет выражение nameof, добавляя поддержку несвязанных универсальных типов, таких как List<> и Dictionary<,>, устраняя необходимость в фиктивных аргументах типа.
- .NET 10: улучшения производительности перебора массивов (де-абстракция массивов в JIT)
В .NET 10 JIT-компилятор уменьшает накладные расходы при переборе массивов через интерфейсы. Смотрите бенчмарки .NET 9 vs .NET 10 с foreach, IEnumerable и условным анализом побега.
- Неявные преобразования Span в C# 14: первоклассная поддержка Span и ReadOnlySpan
C# 14 добавляет встроенные неявные преобразования между Span, ReadOnlySpan, массивами и строками, что даёт более чистые API, лучшее выведение типов и меньше ручных вызовов AsSpan().
- C# 14: ключевое слово field и свойства, опирающиеся на field
C# 14 вводит контекстное ключевое слово field в акцессорах свойств, позволяя добавлять собственную логику к авто-свойствам без отдельного объявления резервного поля.
2025 / 01
- Производительность .NET: ToList vs ToArray
.NET 9 значительно улучшает производительность ToArray за счёт InlineArray, делая его быстрее и экономнее по памяти, чем ToList. Смотрите бенчмарки сравнения .NET 8 и .NET 9.
- C# 13: используйте params-коллекции с любым распознаваемым типом коллекции
C# 13 расширяет модификатор params за пределы массивов, поддерживая Span, ReadOnlySpan, IEnumerable и другие типы коллекций, что уменьшает шаблонный код и повышает гибкость.
- Как перейти на C# 13
Как исправить 'Feature is not available in C# 12.0' и перевести проект на C# 13, изменив target framework или задав LangVersion в файле .csproj.
2024 / 12
- Что нового в C# 14.0
Обзор всех новых возможностей C# 14.0, включая ключевое слово field, члены расширения, null-условное присваивание, неявные преобразования span и многое другое.
- История версий языка C#
Эволюция C# превратила его в современный высокопроизводительный язык. Это руководство отслеживает каждую важную веху. Ранние годы (C# 1.0 - 1.2). C# был выпущен в 2002 году как основной язык для .NET Framework. Он напоминал Java, но с фокусом на разработке под Windows. Версия 1.2 появилась вскоре после с небольшими...
- Что нового в .NET 10
Что нового в .NET 10: LTS-релиз с 3 годами поддержки, новые оптимизации JIT, девиртуализация массивов, улучшения размещения в стеке и многое другое.
2024 / 04
- .NET 8 ToFrozenDictionary: Dictionary против FrozenDictionary
Преобразуйте Dictionary в FrozenDictionary с помощью `ToFrozenDictionary()` в .NET 8 для более быстрого чтения. Бенчмарк, когда применять и компромисс по времени сборки.
2023 / 11
- Как добавить AdMob в ваше приложение на MAUI
Узнайте, как отображать баннерную рекламу AdMob в вашем приложении .NET MAUI на Android и iOS, с пошаговой настройкой и платформенно-специфичными реализациями обработчиков.
- Начало работы с .NET Aspire
Пошаговое руководство по созданию вашего первого приложения .NET Aspire с описанием структуры проекта, обнаружения сервисов и панели мониторинга Aspire.
- Как установить .NET Aspire (dotnet workload install aspire)
Установите .NET Aspire через `dotnet workload install aspire`. Пошаговая настройка .NET 8, workload Aspire и Docker на Windows, macOS и Linux.
- Что такое .NET Aspire?
Обзор .NET Aspire — ориентированного на облако фреймворка для построения масштабируемых распределённых приложений, охватывающего оркестрацию, компоненты и инструментарий.
- C# Случайный выбор элементов из списка
В C# можно случайным образом выбирать элементы из списка с помощью Random.GetItems — метода, появившегося в .NET 8. Узнайте, как это работает, на практических примерах.
- Как опубликовать контейнер как tar.gz в .NET
Узнайте, как опубликовать контейнер .NET 8 в виде архива tar.gz с помощью свойства ContainerArchiveOutputPath и dotnet publish.
- MAUI: как регистрировать обработчики в библиотеке
Узнайте, как регистрировать обработчики представлений и сервисы внутри библиотеки .NET MAUI с использованием паттерна builder и методов расширения MauiAppBuilder.
- Как исправить: 'Point' не имеет предопределённого размера, поэтому sizeof можно использовать только в unsafe-контексте
Исправление ошибки C#, когда sizeof нельзя использовать с Point вне unsafe-контекста. Два решения: включить unsafe-код или использовать Marshal.SizeOf.
- C# Доступ к backing field приватного свойства с помощью Unsafe Accessor
Используйте UnsafeAccessorAttribute в .NET 8 для доступа к автоматически генерируемым backing field приватных авто-свойств в C# без рефлексии.
- C# ZIP-файлы в Stream
.NET 8 включает новые перегрузки CreateFromDirectory и ExtractToDirectory, которые позволяют создавать и извлекать ZIP-файлы напрямую в Stream и из него, без записи на диск.
- Производительность .NET 8: GetGenericTypeDefinition в 10 раз быстрее
Бенчмарки GetGenericTypeDefinition в .NET 8 по сравнению с .NET 7 показывают почти 10-кратный рост производительности. Смотрите код бенчмарка и результаты, полученные с помощью BenchmarkDotNet.
- Как сделать скриншот в .NET core
Научитесь делать снимок всего рабочего стола из консольного приложения .NET с помощью System.Windows.Forms. Решение только для Windows, охватывающее все мониторы.
- C# Как обновить readonly-поле с помощью UnsafeAccessor
Узнайте, как в C# обновить readonly-поле с помощью UnsafeAccessor — альтернативы рефлексии без потерь производительности. Доступно в .NET 8.
- Производительность .NET 8: UnsafeAccessor против рефлексии
Бенчмарк UnsafeAccessor против рефлексии в .NET 8. Посмотрите, как UnsafeAccessor добивается производительности без накладных расходов по сравнению с классической рефлексией.
2023 / 10
- C# UnsafeAccessor: приватные члены без рефлексии (.NET 8)
Используйте атрибут `[UnsafeAccessor]` в .NET 8, чтобы читать приватные поля и вызывать приватные методы без накладных расходов: без рефлексии и с полной поддержкой AOT.
- C# Как помечать функциональность как экспериментальную
Начиная с C# 12, новый ExperimentalAttribute позволяет помечать типы, методы, свойства или сборки как экспериментальные. Узнайте, как использовать его с diagnosticId, pragma-тегами и UrlFormat.
- C# параметры ref readonly
Модификатор ref readonly в C# даёт более прозрачный способ передавать ссылки только для чтения. Узнайте, как он улучшает модификатор in за счёт более чётких ограничений и видимости для вызывающей стороны.
- C# как перемешать массив?
Самый простой способ перемешать массив в C# — использовать Random.Shuffle, появившийся в .NET 8. Метод работает in-place как с массивами, так и со спанами.
- System.Text.Json Как изменить существующий type info resolver
Используйте новый метод-расширение WithAddedModifier в .NET 8, чтобы легко изменять любой контракт сериализации IJsonTypeInfoResolver, не создавая resolver с нуля.
- HttpClient получаем JSON как AsyncEnumerable
Новый метод-расширение GetFromJsonAsAsyncEnumerable в .NET 8 десериализует JSON из тела HTTP-ответа в IAsyncEnumerable. Узнайте, как использовать его с await foreach.
- JsonNode обновления API в .NET 8
Разбираем новые API в .NET 8 для JsonNode и JsonArray: GetValueKind, GetPropertyName, GetElementIndex, ReplaceWith и ParseAsync.
- Глубокое клонирование и глубокое сравнение JsonNode
Узнайте, как использовать новые методы DeepClone() и DeepEquals() у JsonNode в .NET 8 для глубокого клонирования и сравнения JSON-узлов.
- System.Text.Json отключаем сериализацию на основе рефлексии
Узнайте, как, начиная с .NET 8, отключить сериализацию на основе рефлексии в System.Text.Json для trimmed- и native AOT-приложений с помощью свойства JsonSerializerIsReflectionEnabledByDefault.
- Добавление/удаление TypeInfoResolver у существующих JsonSerializerOptions
Узнайте, как добавлять или удалять экземпляры TypeInfoResolver у существующих JsonSerializerOptions с помощью нового свойства TypeInfoResolverChain в .NET 8.
- WPF Не добавлять выбранные в диалоге файлы в недавние
Не давайте выбору в диалогах файлов WPF попадать в недавние Проводника и меню Пуск, выставив AddToRecent в false в .NET 8.
- WPF Индивидуальные состояния диалогов с помощью ClientGuid
Используйте свойство ClientGuid в .NET 8, чтобы сохранять индивидуальные состояния диалогов — размер окна, положение и последнюю используемую папку — для каждого WPF-диалога файлов отдельно.
- C# 12 Interceptors
Знакомимся с interceptors из C# 12 — экспериментальной возможностью компилятора в .NET 8, позволяющей подменять вызовы методов на этапе компиляции с помощью атрибута InterceptsLocation.
- WPF Ограничиваем дерево папок OpenFileDialog одной папкой
Узнайте, как ограничить дерево папок WPF-диалога OpenFileDialog заданной корневой папкой с помощью свойства RootDirectory в .NET 8.
- Аппаратное ускорение WPF в RDP
Узнайте, как в .NET 8 включить аппаратное ускорение WPF поверх RDP для лучшей производительности и более отзывчивого удалённого рабочего стола.
- WPF Open / Select Folder Dialog (OpenFolderDialog в .NET 8)
Используйте новый `OpenFolderDialog` из .NET 8 в WPF, чтобы пользователи могли открывать и выбирать одну или несколько папок. Заменяет старый костыль с FolderBrowserDialog из WinForms.
2023 / 09
- Implementation type Data.AppDbContext can't be converted to service type Microsoft.AspNetCore.Identity.IUserStore
Исправляем ошибку ASP.NET Core Identity, когда AppDbContext не может быть преобразован в IUserStore, добавлением AddEntityFrameworkStores в конфигурацию identity.
- .NET 8 сериализация свойств из иерархий интерфейсов
.NET 8 добавляет поддержку сериализации свойств из иерархий интерфейсов, включая все свойства всех интерфейсов в зависимости от объявленного типа переменной.
- .NET 8 десериализация в непубличные свойства
Узнайте, как в .NET 8 десериализовать JSON в непубличные свойства с помощью атрибута JsonInclude и параметризованных конструкторов.
- .NET 8 как использовать JsonStringEnumConverter с native AOT
Узнайте, как использовать новый JsonStringEnumConverter<TEnum> в .NET 8 для совместимой с native AOT сериализации перечислений в System.Text.Json.
- The type or namespace name InterceptsLocationAttribute could not be found
Как исправить ошибку CS0246 для InterceptsLocationAttribute в interceptors C#, объявив атрибут самостоятельно.
- .NET 8 пометить JsonSerializerOptions как readonly
Узнайте, как в .NET 8 пометить экземпляры JsonSerializerOptions как только для чтения с помощью MakeReadOnly и как проверить свойство IsReadOnly.
- .NET 8 сериализация Half, Int128 и UInt128
В .NET 8 System.Text.Json добавляет встроенную поддержку сериализации числовых типов Half, Int128 и UInt128.
- .NET 8 Memory<byte> сериализуется как base64
Начиная с .NET 8, и Memory<byte>, и ReadOnlyMemory<byte> сериализуются как строки Base64, тогда как другие типы вроде Memory<int> остаются JSON-массивами.
- .NET 8 включаем непубличные члены в JSON-сериализацию
Узнайте, как в .NET 8 включить private, protected и internal свойства в JSON-сериализацию с помощью атрибута JsonInclude.
- dotnet workload clean
Используйте команду `dotnet workload clean`, чтобы удалить оставшиеся .NET workload-паки после обновления SDK или Visual Studio: когда применять, что удаляется и подводные камни.
- .NET 8 десериализация в свойства только для чтения
Узнайте, как в .NET 8 десериализовать JSON в свойства только для чтения без сеттера с помощью JsonObjectCreationHandling или JsonSerializerOptions.
- .NET 8 обработка лишних членов при десериализации JSON
Узнайте, как в .NET 8 заставить десериализацию бросать исключение для несопоставленных JSON-свойств с помощью JsonUnmappedMemberHandling.
2023 / 08
- Как установить dotnet script
dotnet script позволяет запускать C#-скрипты (.CSX) из .NET CLI. Единственное требование — наличие .NET 6 или новее на машине. Установить dotnet-script глобально можно следующей командой: Затем для выполнения файла-скрипта достаточно вызвать dotnet script <file_path>, как в примере ниже: Как...
- C# Как дождаться завершения процесса?
Дождаться завершения процесса можно с помощью метода WaitForExit. Ваш код синхронно подождёт, пока процесс завершится, и затем продолжит выполнение. Рассмотрим пример: Этот код запустит новый процесс cmd.exe и выполнит команду timeout 5. Вызов process.WaitForExit() заставит вашу программу...
- .NET 8 JsonNamingPolicy: SnakeCaseLower и KebabCaseLower (System.Text.Json)
Используйте новые `JsonNamingPolicy.SnakeCaseLower` (а также SnakeCaseUpper, KebabCaseLower, KebabCaseUpper) в .NET 8 для сериализации JSON в snake_case / kebab-case через System.Text.Json без своего конвертера.
2023 / 06
- dotnet new api -aot: '-aot' is not a valid option
Исправьте ошибку '-aot is not a valid option', используя правильный синтаксис с двойным дефисом: dotnet new api --aot.
- Как начать программировать на C#
Руководство для начинающих по началу программирования на C#: от установки Visual Studio до написания первой программы и поиска ресурсов для обучения.
- Что нового в .NET 8
.NET 8 был выпущен 14 ноября 2023 года как версия LTS (Long Term Support), что означает поддержку, обновления и исправления ошибок не менее трёх лет с даты выхода. Как обычно, .NET 8 включает поддержку новой версии языка C#, а именно C# 12.