Статьи с тегом «.NET»
Статьи с тегом «.NET» (63 шт.), от новых к старым.
-
Корпоративный прокси и приложения Windows — как WinINET, WinHTTP и .NET выбирают прокси
Браузер выходит в интернет, а бизнес-приложение не проходит корпоративный прокси. Чаще всего WinINET, WinHTTP, переменные окружения и .NET читают разные пара...
-
Практические рекомендации по многопоточности: .NET — что решить до добавления потоков
Проверенные приёмы проектирования на .NET/C#, чтобы код не «иногда падал или зависал»: не создавать потоки вручную и опираться на Task, сокращать разделяемое...
-
WMI/CIM из C# и PowerShell — практическое руководство по сведениям об оборудовании, мониторингу процессов и удалённым запросам
WMI/CIM — стандартный способ получить серийный номер ПК, следить за свободным местом на диске и ловить запуск процессов. Разбираем командлеты CIM вроде Get-C...
-
Глубины ввода-вывода Windows (часть 5) — внутреннее устройство NTFS: файловая система через MFT
Часть 5 серии со схемами внутреннего устройства NTFS. MFT и записи файлов, несколько потоков данных (Zone.Identifier), жёсткие ссылки и имена 8.3, точки повт...
-
Глубины ввода-вывода Windows (часть 4) — диспетчер кэша: когда WriteFile оказывается на диске
Четвёртая часть серии со схемами диспетчера кэша Windows. Разбираем кэш как проекцию файла, упреждающее чтение и отложенную запись, когда применять FlushFile...
-
Обратная совместимость интерфейсов DLL и COM — таблица: какие изменения ломают вызывающий код
Какие изменения DLL или COM-компонента ломают вызывающий код. Разбираем три слоя совместимости — бинарную, исходного кода и поведенческую, — таблицу решений ...
-
Версионирование схемы БД бизнес-приложения — практика миграций, чтобы у клиентов не оказалось «у каждого своя база»
Практическое руководство по версионированию схемы БД бизнес-приложения, которое стоит у множества клиентов. Разбираем PRAGMA user_version и последовательные ...
-
CI/CD для WinForms / WPF: сборка, подпись и распространение в GitHub Actions
Практическое руководство по CI/CD для WinForms / WPF в GitHub Actions. Минимальный YAML сборки и тестов на windows-latest, нумерация версий по тегам, подпись...
-
Как безопасно менять унаследованное бизнес-приложение без тестов — характеризационные тесты и рефакторинг на практике
На примерах C# разбираем, как безопасно менять бизнес-приложение без тестов: как зафиксировать текущее поведение характеризационным тестом (метод golden mast...
-
Если Microsoft Defender принял ваше Windows-приложение за вирус — ложные срабатывания и влияние на производительность
Разбираем штатный порядок действий, если Microsoft Defender ложно определяет ваше Windows-приложение как вредоносное. Как устроена современная антивирусная з...
-
Спящий режим, гибернация и Modern Standby: как не дать долгоживущему приложению остановиться ночью
Разбираем, почему долгоживущее Windows-приложение к утру оказывается остановленным: чем отличаются спящий режим S3, гибернация и Modern Standby, как во сне в...
-
Запустятся ли бизнес-приложения на Windows on Arm — эмуляция x64 (Prism) и реальность нативных DLL и COM
Разработчикам и ИТ-службам: запустится ли бизнес-приложение на Windows on Arm. Разбираем, как устроена эмуляция x64 (Prism), какие слои она не покрывает, про...
-
MAX_PATH и ловушки путей и имён файлов в Windows — лимит 260 символов, зарезервированные имена, точка в конце, регистр
Разбираем ограничения путей и имён файлов — типичную причину ошибки «файл не найден». Из чего складывается MAX_PATH=260, как включить длинные пути через Long...
-
Сетевые диски и UNC-пути: типичные ловушки ── как бизнес-приложению работать с файловым сервером (общей папкой)
Разбираем типичные сбои, когда бизнес-приложение пишет в общую папку или следит за ней. Почему службе не видна буква диска (Z:), какие права нужны для каждой...
-
Значок в области уведомлений и toast в Windows-приложении: ошибки NotifyIcon и выбор AppNotification
Разбираем, как держать бизнес-приложение Windows в области уведомлений и показывать toast. Правильная работа с NotifyIcon, повторная регистрация после переза...
-
Как долго проработают приложения VB6 — поддержка среды выполнения и миграция на .NET
Как долго ещё проработают приложения на VB6? Среда выполнения поддерживается и в Windows 11, поддержка IDE уже закончилась. В статье — таблица выбора между п...
-
Японский календарь, праздники и даты закрытия в бизнес-приложениях — устойчивость к смене эры, JapaneseCalendar и расчёт рабочих дней
Разбираем обработку дат, характерную для японских бизнес-приложений: вывод по японскому календарю, расчёт рабочих дней без праздников и даты закрытия. Дальше...
-
Локализация WinForms и WPF: resx, спутниковые сборки, переключение культуры
Разбираем локализацию десктопных приложений Windows: чем CurrentCulture отличается от CurrentUICulture, как устроены resx и спутниковые сборки, какой способ ...
-
CSV — не «просто текст». Практика CSV в бизнес-приложениях на C# (кодировки, совместимость с Excel, защита от инъекций)
Разбираем типичные сбои ввода-вывода CSV в бизнес-приложениях — самописный разбор через Split(','), искажение текста в Excel из-за UTF-8 без BOM, потерю нача...
-
Не создавайте HttpClient в using на каждый запрос — создание, тайм-ауты и повторные попытки в C#
Если создавать HttpClient через using на каждый запрос, исчерпываются сокеты; static-экземпляр не отслеживает смену DNS. Разбираем схемы через PooledConnecti...
-
Как найти причину «тормозов» с PerfView и dotnet-trace — практика анализа производительности .NET
Когда бизнес-приложение тормозит или ЦП постоянно на максимуме, какой инструмент взять и на что смотреть. Разделение ролей PerfView и dotnet-trace, чтение сэ...
-
Журнал событий Windows и ETW: как вывести логи бизнес-приложения в стандартные механизмы ОС
Журнал событий и ETW — отдельный слой записей, который видят специалисты по эксплуатации и стандартные средства ОС. Разбираем, как разделить роли трёх механи...
-
Не только appsettings.json — практика конфигурации бизнес-приложений Windows (среды, секреты, куда писать)
Разбираем управление конфигурацией бизнес-приложений Windows. Показываем слои appsettings.json, когда брать IOptions, а когда IOptionsMonitor, настройки по с...
-
Печать и PDF в Windows-приложениях: PrintDocument, WPF и библиотеки отчётов
Печать WinForms через PrintDocument, печать WPF через FlowDocument и FixedDocument и варианты вывода PDF сведены в таблицу по требованиям. Разбираются разрыв...
-
Как ясно представить модель OSI — разбираем один HTTP-запрос по семи уровням
Разбираем модель OSI на реальном кадре. Собираем на C# Ethernet-кадр с HTTP GET, разбираем его и в Wireshark видим, как уровни вложены друг в друга. Сопостав...
-
Как устроена изоляция сеансов Windows — Session 0, RDP и одновременная работа нескольких пользователей
Разбираем понятие «сеанса», которое часто путает разработчиков Windows-приложений. С практической стороны объясняем, почему изоляция Session 0 не даёт службе...
-
Как читать аварийные дампы в WinDbg + SOS — практика анализа после сбора
Разбираем, как читать аварийный дамп Windows в WinDbg с расширением SOS: настройка пути к символам, поиск исключений и утечек через !clrstack и !dumpheap, ко...
-
Защита Windows-приложения от повторного запуска — именованный Mutex и активация окна при втором старте
Разбираем, как в бизнес-приложении Windows запретить повторный запуск через именованный Mutex. Разберём ловушку RDP из-за разницы Global\ и Local\, Abandoned...
-
Безопасный вызов Win32 API из C# — практическое руководство по P/Invoke (DllImport / LibraryImport / CsWin32)
Разбираем, как на практике вызывать Win32 API из C# через P/Invoke: чем DllImport отличается от LibraryImport, как CsWin32 генерирует сигнатуры, ловушки марш...
-
Аутентификация Entra ID в WinForms и WPF: MSAL.NET и брокер WAM
Как добавить вход через Entra ID в десктопное приложение WinForms или WPF: общедоступный клиент, регистрация приложения, AcquireTokenSilent в MSAL.NET, броке...
-
Дата, время и часовые пояса в бизнес-приложениях — ловушки DateTime, хранение в UTC и тесты
После переноса сервера время сдвигается на 9 часов. Разбираем, откуда берутся такие сбои: Kind у DateTime и неявные преобразования. Дальше — когда брать Date...
-
UI-автотесты десктопных приложений Windows — UI Automation и устойчивые тесты на FlaUI
Разбираем UI-автотесты WinForms и WPF с устройства Windows UI Automation. Минимальная реализация на FlaUI, AutomationId и ожидание по условию, чтобы тесты не...
-
Высокий DPI в WPF — почему «к DPI должен быть готов», а на деле всё размывается
WPF по умолчанию System DPI Aware, но при переносе окна на монитор с другим DPI всё изображение размывается, а растр теряет резкость. Разбираем диагностику, ...
-
Почему после работы с Excel из C# остаётся EXCEL.EXE — освобождение COM-ссылок и решение о замене
Разбираем, почему при автоматизации Excel из C# через COM остаётся процесс EXCEL.EXE: счётчик ссылок COM, RCW, ловушка «правила двух точек», паттерны освобож...
-
Поддержка высокого DPI в WinForms — почему на 4K размывается или ломается макет
Разбираем, почему WinForms-приложение на 4K-мониторе размывается или ломается: виртуализация DPI и режимы осведомлённости о DPI (System Aware / Per-Monitor V...
-
Как выбрать межпроцессное взаимодействие в Windows — таблица: именованные каналы, TCP, gRPC, разделяемая память, COM
Как выбрать способ связи между Windows-приложениями. В таблице решений разобраны сильные стороны и типичные ошибки именованных каналов, локального TCP, gRPC,...
-
SQLite в бизнес-приложениях на C# — режим WAL, блокировки записи, защита от повреждений и выбор EF Core
Практические сведения о встраивании SQLite в бизнес-приложение через Microsoft.Data.Sqlite: режим WAL, SQLITE_BUSY и сведение записи к одному пути, ловушки с...
-
Как создать и эксплуатировать службу Windows — от выбора между Планировщиком заданий и службой до превращения BackgroundService в службу
Стоит ли держать постоянно работающую обработку как службу Windows или хватит Планировщика заданий. Практический разбор: таблица выбора, создание службы на ....
-
После режима IE — подойдёт ли WebView2? Ограничение ActiveX и реалистичный план миграции
С точки зрения внутренних корпоративных систем разбираем устройство WebView2, стратегии распространения Evergreen и Fixed Version, типичную ошибку с папкой п...
-
Где хранить данные Windows-приложения: таблица решений SQLite / JSON / реестр / Access
Куда и в каком виде хранить данные настольного Windows-приложения. Разбираем выбор между AppData и ProgramData, сильные стороны и ловушки SQLite, JSON-файлов...
-
Что такое PDB (Program Database) — отладочная информация, символы и Source Link
Что такое PDB (Program Database), что в нём есть и чего нет, как он связан с Debug и Release, Portable PDB, Source Link, серверами символов и разбором дампов...
-
Roslyn: как читать, править и генерировать C# глазами компилятора
Разбираем Roslyn (.NET Compiler Platform): Syntax Tree, SemanticModel, Workspace, Analyzer, Source Generator — где это применять на практике и на что смотреть.
-
Что продумать перед заказом разработки Windows-приложения
Перед заказом разработки Windows-приложения разберём, что стоит прояснить: доработка существующего ПО, интеграция с оборудованием, COM/ActiveX, развёртывание...
-
Алгебраические типы данных в .NET Framework и .NET — состояние и результат через тип
Как выразить алгебраические типы данных, в первую очередь типы-суммы и размеченные объединения, в .NET Framework и в современном .NET: F#, иерархии классов в...
-
Как работать с токенами олицетворения Windows — олицетворение на уровне потока и безопасный откат
В статье собраны практические правила безопасной работы с токенами олицетворения Windows: токен доступа, первичный токен, токен потока, уровни олицетворения,...
-
TCP не отдаёт Receive теми же порциями, что Send — приём как байтовый поток
Если считать, что в TCP данные приходят теми же порциями, которыми их отправили через Send или Write, возникают разбиение, склейка, порча текста и поломка пр...
-
.NET: как отличить ожидание GC от утечки памяти — практические шаги наблюдения, сравнения и доказательства роста памяти
Разбираем, как с помощью dotnet-counters, dotnet-gcdump и dotnet-dump определить, растёт ли память в .NET-приложении из-за ожидания сборки мусора или это дей...
-
Как запустить PowerShell из C# (CSharp) и получить результат в виде объектов
Разбираем, как запустить PowerShell из C# и получить результат не строкой, а как PSObject: PowerShell SDK, AddCommand, AddParameter, BaseObject, Properties и...
-
Почему Windows стала такой: эволюция глазами разработчика
Прослеживаем изменения от Windows 95 до Windows 11 не как хронику внешнего вида, а глазами разработчика Windows-приложений: совместимость, стабильность, прав...
-
Что такое ClickOnce — как устроен, как обновляется, где подходит и где нет
Разбираем ClickOnce — технологию распространения десктопных .NET-приложений для Windows: манифесты, обновления, кэш, подпись, а также случаи, где он подходит...
-
Чек-лист безопасной работы с дочерними процессами в Windows-приложении
Чтобы безопасно работать с дочерними процессами в Windows-приложении, важнее не API запуска, а владение деревом процессов и процедура завершения. Разбираем J...
-
Распространение Windows-приложения одним файлом — single binary и пределы зависимости от ОС
Когда хочется свести Windows-приложение к одному EXE, важно различать «сделать один файл поставки» и «убрать зависимость от ОС». Разбираем это на примере .NE...
-
Подводные камни приложений последовательной связи: переподключение и логи
Разбираем типичные ловушки приложений последовательной связи при интеграции с оборудованием и управлении измерительными приборами: границы кадров, тайм-ауты,...
-
Чек-лист перед миграцией с .NET Framework на .NET
Практический чек-лист того, что проверить перед миграцией с .NET Framework на .NET: типы проектов, неподдерживаемые технологии, зависимости NuGet, SDK-стиль,...
-
Что такое .NET Generic Host — основа для DI, конфигурации и логирования
Разбираем роль Generic Host через связь DI, конфигурации, логирования, IHostedService и BackgroundService и с практической стороны показываем, где он даёт эф...
-
Что такое .NET Native AOT — чем он отличается от JIT и trimming
Разбираем, что такое Native AOT, через отличия от JIT, ReadyToRun, self-contained, single-file, trimming и source generator, и с практической стороны — где о...
-
Три таймера .NET: как выбирать PeriodicTimer, Timer и DispatcherTimer
Чем отличаются PeriodicTimer, System.Threading.Timer и DispatcherTimer и как выбирать между ними для async-работы, callback на ThreadPool и обновления UI в WPF.
-
Как вызвать Native AOT DLL на C# из C/C++
Как опубликовать библиотеку классов C# как нативную DLL через Native AOT и вызывать точки входа UnmanagedCallersOnly из C/C++: когда схема уместна, какие пат...
-
Зачем использовать .NET Generic Host и BackgroundService в десктопных приложениях
Как с помощью Generic Host и BackgroundService собрать запуск, периодическую работу, завершение, логи, конфигурацию и DI в Windows-инструментах и фоновых при...
-
Как сегодня поступать с ActiveX / OCX: оставить, обернуть или заменить
Как выбрать, оставить, обернуть или заменить ActiveX / OCX, с учётом 32-бит/64-бит, регистрации, зависимости от браузера и поддержки вендора.
-
WPF и WinForms: async/await и поток UI
Куда после await возвращается выполнение в WPF и WinForms, как работают Dispatcher и Invoke, зачем ConfigureAwait(false) и почему .Result и .Wait() вешают UI.
-
Практическое руководство по FileSystemWatcher — как не терять уведомления и что делать с дублями
Как пользоваться FileSystemWatcher и где он подводит: потерянные уведомления, дубли, ловушки определения готовности, повторное сканирование, атомарный claim ...
-
Практическая таблица решений для C# async/await — Task.Run и ConfigureAwait
Разбираем лучшие практики C# async/await — ожидание I/O, вычисления CPU, Task.Run, ConfigureAwait(false) и fire-and-forget — вместе с таблицей решений.