Статьи с тегом «.NET»
Статьи с тегом «.NET» (58 шт.), от новых к старым.
-
Обратная совместимость интерфейсов DLL и COM — таблица решений: какие изменения ломают вызывающую сторону
Какие изменения DLL или COM-компонента на самом деле ломают вызывающую сторону? Разбираем три слоя совместимости — бинарную, исходную и поведенческую, — табл...
-
Версионирование схемы БД бизнес-приложения — практика миграций, предотвращающая «у каждого клиента своя база»
Практическое руководство по версионированию схемы БД бизнес-приложения, установленного у множества клиентов. Разбираем PRAGMA user_version и реализацию после...
-
CI/CD для приложений WinForms / WPF на практике — автоматизация от сборки до подписи и распространения через GitHub Actions
Практическое руководство по настройке CI/CD для приложений WinForms / WPF через GitHub Actions. Минимальный YAML для сборки и тестов на windows-latest, нумер...
-
Как безопасно вносить изменения в legacy-приложение без тестов — характеризационное тестирование и рефакторинг на практике
На примерах C# разбираем порядок характеризационного тестирования (метод golden master) для фиксации текущего поведения, способы создания «швов» (seam) и пра...
-
Если ваше Windows-приложение приняли за вирус — как реагировать на ложные срабатывания Microsoft Defender и жить с влиянием на производительность
Разбираем правильный порядок действий, если Microsoft Defender ложно определяет ваше Windows-приложение как вредоносное: как устроена современная антивирусна...
-
Спящий режим, гибернация, Modern Standby и долго работающие приложения — как проектированием предотвратить «остановилось ночью»
Разбираем, почему долго работающее Windows-приложение оказывается «остановленным к утру», начиная с различий между спящим режимом S3, гибернацией и Modern St...
-
Работают ли бизнес-приложения на Windows на Arm — реальность x64-эмуляции (Prism) и нативных DLL/COM
Отвечаем разработчикам и ИТ-специалистам на вопрос «заработает ли наше бизнес-приложение на Windows на Arm». Разбираем принцип работы x64-эмуляции (Prism), с...
-
MAX_PATH и подводные камни путей/имён файлов в Windows — лимит 260 символов, зарезервированные имена, конечная точка, регистр
Разбираем ограничения путей и имён файлов, которые часто стоят за классической ошибкой «файл не найден». Рассматриваем состав лимита MAX_PATH=260, включение ...
-
Подводные камни сетевых дисков и UNC-путей ── как бизнес-приложения работают с файловым сервером (общей папкой)
Разбираем типичные проблемы, возникающие при выводе данных и мониторинге общей папки из бизнес-приложения: почему буква диска (Z:) не видна службе, какие пра...
-
Значки в области уведомлений и всплывающие (toast) уведомления в Windows-приложениях — подводные камни NotifyIcon и выбор правильного AppNotification
Практическое руководство о том, как удерживать бизнес-приложение Windows в области уведомлений (system tray) и оповещать пользователя с помощью всплывающих (...
-
До каких пор будут работать приложения VB6 ── состояние поддержки среды выполнения и практичный путь миграции на .NET
До каких пор будут работать приложения VB6? В статье разбирается асимметрия между политикой поддержки среды выполнения VB6 (поддерживается даже в Windows 11)...
-
Японская эра, праздники и даты закрытия периода в бизнес-приложениях — устойчивый к смене эры дизайн, JapaneseCalendar и расчёт рабочих дней на практике
Показать «Рэйва 8» в отчёте, рассчитать рабочие дни без учёта праздников, оплатить в последний рабочий день месяца, следующего за закрытием периода 20-го чис...
-
Интернационализация приложений WinForms/WPF — resx, сателлитные сборки и переключение культуры на практике
Разбираем интернационализацию десктопных приложений Windows на практике: различие между CurrentCulture и CurrentUICulture, устройство ресурсов через resx и с...
-
CSV — не «просто текст»: практика работы с CSV в бизнес-приложениях на C# (кодировки, совместимость с Excel, защита от инъекций)
Разбираем типичные ошибки при вводе-выводе CSV в бизнес-приложениях — самописный парсинг через Split(','), искажение текста в Excel из-за UTF-8 без BOM, поте...
-
Не оборачивайте HttpClient в using ── практика HTTP-взаимодействия в бизнес-приложениях на C# (паттерны создания, тайм-ауты, повторные попытки)
HttpClient в C#, создаваемый через using при каждом запросе, приводит к исчерпанию сокетов, а статический HttpClient перестаёт учитывать изменения DNS. Разби...
-
Как точно найти причину «медленной работы» с PerfView и dotnet-trace — практическое введение в анализ производительности .NET
Когда бизнес-приложение «работает медленно», «загружает ЦП под завязку» или «иногда зависает», какой инструмент выбрать и на что смотреть? В статье разобраны...
-
Введение в журнал событий Windows и ETW — как использовать стандартные механизмы ОС для логов бизнес-приложения
Ваше Windows-бизнес-приложение опирается только на файловые логи? Журнал событий и ETW — это записи другого уровня, видимые операционному персоналу и стандар...
-
Не только appsettings.json — практическое руководство по управлению конфигурацией Windows-бизнес-приложений (настройки окружений, секреты и место записи)
Практический разбор управления конфигурацией Windows-бизнес-приложений: слои appsettings.json, выбор между IConfiguration и семейством IOptions/IOptionsSnaps...
-
Печать и вывод PDF в Windows-бизнес-приложениях — выбор между System.Drawing.Printing, WPF и библиотеками отчётов
В виде таблицы выбора по требованиям собраны печать WinForms через PrintDocument, печать WPF через FlowDocument/FixedDocument и варианты вывода PDF. Рассматр...
-
По-настоящему разобраться в модели OSI — препарируем один HTTP-запрос на семь уровней
Разбираем модель OSI не через зубрёжку, а на реальном примере. На C# мы собираем и препарируем Ethernet-кадр, несущий один HTTP GET-запрос, и с помощью hex-д...
-
Как понимать изоляцию сеансов Windows — Session 0, RDP и одновременная работа нескольких пользователей
В этой статье разбирается понятие «сеанса» (session) в Windows — тема, которая постоянно сбивает с толку разработчиков Windows-приложений. Рассматривается, п...
-
Чтение крэш-дампов с WinDbg + SOS ── практическое введение в анализ после сбора
Разбираем, как читать крэш-дамп Windows-приложения с помощью WinDbg и расширения SOS: настройку пути к символам, отслеживание исключений и утечек памяти чере...
-
Защита от повторного запуска приложения Windows — именованный Mutex и активация окна при повторном запуске
Разбираем, как реализовать защиту бизнес-приложения Windows от повторного запуска с помощью именованного Mutex: подводные камни RDP-окружений из-за различий ...
-
Безопасный вызов 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: концепцию публичного клиента, регистрацию приложения, паттерн Acq...
-
Дата, время и часовые пояса в бизнес-приложениях — от ловушек DateTime до принципа хранения в UTC и проектирования тестов
Перенос сервера сдвигает время на 9 часов — разбираем причины подобных сбоев начиная со свойства Kind у DateTime и неявных преобразований. Рассматриваем выбо...
-
Автоматическое UI-тестирование десктопных приложений Windows — как устроен UI Automation и как строить устойчивые тесты на FlaUI
Разбираем автоматическое UI-тестирование WinForms/WPF-приложений от основ Windows UI Automation. Минимальная реализация на FlaUI, проектирование AutomationId...
-
Высокий DPI в WPF — почему всё «должно быть само в порядке», а на деле размывается и плывёт, и что с этим делать
WPF по умолчанию System DPI Aware, но при переносе окна на монитор с другим DPI всё изображение размывается, а растровые картинки становятся нечёткими. Разби...
-
Почему процесс EXCEL.EXE остаётся висеть после работы с Excel через COM в C# — паттерны освобождения ссылок и когда стоит отказаться от COM
Разбираем, почему при автоматизации Excel из C# через Microsoft.Office.Interop.Excel остаётся висеть процесс EXCEL.EXE, опираясь на подсчёт ссылок COM и меха...
-
Поддержка высокого DPI в WinForms — почему интерфейс размывается или разваливается на 4K-мониторах, и как это исправить
Разбираем причины размытия и поломки интерфейса WinForms-приложений на 4K-мониторах через DPI-виртуализацию и режимы DPI-осведомлённости (System Aware / Per-...
-
Как выбрать межпроцессное взаимодействие в Windows — таблица решений: именованные каналы / TCP / gRPC / разделяемая память / COM
Разбираем, как выбрать способ взаимодействия Windows-приложений друг с другом: сильные стороны и ловушки именованных каналов, локального TCP, gRPC, разделяем...
-
SQLite в бизнес-приложениях на C# — режим WAL, эксклюзивная блокировка, защита от повреждений и выбор между EF Core и голым ADO.NET
Разбираем практические знания по внедрению SQLite в бизнес-приложение через Microsoft.Data.Sqlite: режим WAL, SQLITE_BUSY и консолидацию записи, ловушки сопо...
-
Как создавать и эксплуатировать службы Windows — от выбора между планировщиком заданий и службами до превращения BackgroundService в службу Windows
Разбираем, стоит ли превращать резидентную обработку в службу Windows или достаточно планировщика заданий: таблица решений, создание службы на основе .NET Wo...
-
После 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-приложения, разберём, что нужно прояснить: доработка существующего ПО, интеграция с обор...
-
Алгебраические типы данных в .NET Framework и .NET — как выразить состояние и результат через тип
Рассматриваем, как использовать алгебраические типы данных — в первую очередь суммарные типы и размеченные объединения — в .NET Framework и .NET, и какие пре...
-
Как правильно работать с токенами олицетворения в Windows — заимствование прав на уровне потока и безопасный откат
Разбираем токены олицетворения в Windows — токены доступа, первичные и потоковые токены, уровни олицетворения, RevertToSelf и WindowsIdentity.RunImpersonated...
-
Заблуждение, что 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 до BaseObje...
-
Почему Windows стала такой, какая она есть: эволюция Windows глазами разработчика
Разбираем изменения от Windows 95 до Windows 11 не как визуальную хронологию, а с точки зрения разработчика Windows-приложений: совместимость, стабильность, ...
-
Что такое ClickOnce - механизм работы, обновления и случаи применения с практической точки зрения
Разбираем ClickOnce - технологию распространения .NET-приложений для Windows: манифесты, обновления, кэш, подпись, а также случаи, где он подходит и где нет,...
-
Чек-лист безопасной работы с дочерними процессами в Windows-приложении
Для безопасной работы с дочерними процессами в Windows-приложении важнее не API запуска, а то, кто владеет деревом процессов, и как спроектирована процедура ...
-
Распространение Windows-приложения одним файлом — единый бинарный файл и пределы зависимости от ОС
Когда хочется свести Windows-приложение к одному EXE, важно различать «сделать один файл распространения» и «избавиться от зависимости от ОС». Разбираем этот...
-
Подводные камни приложений с последовательной связью — вплоть до переподключения и проектирования логов
Разбираем с практической точки зрения подводные камни приложений с последовательной связью, которых стоит избегать при интеграции с оборудованием и управлени...
-
Чек-лист перед миграцией с .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 и ...
-
Как вызвать C# Native AOT DLL из C/C++
Разбираем, как публиковать библиотеку классов C# в виде нативной DLL через Native AOT и вызывать точки входа UnmanagedCallersOnly из C/C++ — где это уместно,...
-
Зачем использовать .NET Generic Host и BackgroundService в десктопных приложениях
Разбираем, как использовать Generic Host и BackgroundService, чтобы упорядочить запуск, периодическую обработку, завершение работы, логирование, конфигурацию...
-
Как сегодня поступать с ActiveX / OCX - таблица решений: оставить, обернуть или заменить
Разбираем, что выбрать при обнаружении ActiveX / OCX — оставить, обернуть или заменить, — учитывая 32-бит/64-бит, регистрацию, зависимость от браузера и подд...
-
WPF/WinForms: async и UI-поток — сводка на одном листе
Разбираем, куда возвращается выполнение после await в WPF / WinForms, Dispatcher / Invoke, ConfigureAwait(false), а также узкие места вокруг .Result / .Wait().
-
Практическое руководство по FileSystemWatcher — защита от потерянных и повторяющихся уведомлений
Разбираем использование FileSystemWatcher и его подводные камни — потерянные уведомления, дублирующиеся события, ловушки определения завершения, повторное ск...
-
Практическая таблица решений для C# async/await — Task.Run и ConfigureAwait
Разбираем лучшие практики C# async/await — ожидание I/O, вычисления CPU, Task.Run, ConfigureAwait(false) и fire-and-forget — вместе с таблицей решений.