
WinForms на VB.NET в .NET 8: Upgrade Assistant, My, удалённые контролы и подводные камни
Visual Basic в современном .NET жив: WinForms-приложения на VB.NET собираются под .NET 8, дизайнер форм работает, а пространство My поддерживается. Но перенос это не смена одной строки в проекте. Разбираем, что сделает инструмент, а что придётся доделать руками.
Зачем переносить и на какую версию
.NET Framework 4.8 по-прежнему поддерживается как компонент Windows, но новых возможностей не получает. Переход на современный .NET даёт заметный прирост производительности, поддержку высоких DPI с режимом PerMonitorV2, свежие версии библиотек, которые давно перестали выпускаться под Framework, и возможность публиковать приложение вместе со средой выполнения.
Выбирая целевую версию, смотрите на сроки поддержки. .NET 8 это LTS-релиз, но его поддержка заканчивается 10 ноября 2026 года. .NET 10 вышел в ноябре 2025 года и тоже имеет статус LTS. Если проект начинается сейчас, разумно сразу целиться в .NET 10, а .NET 8 использовать как промежуточную точку, если какая-то зависимость пока не готова. Всё, что описано ниже, одинаково относится к обеим версиям.
Что делает .NET Upgrade Assistant
Upgrade Assistant устанавливается как расширение Visual Studio, после чего в контекстном меню проекта появляется пункт Upgrade. Для WinForms-проекта на VB.NET он умеет выполнять обновление на месте: переводит .vbproj в SDK-формат, меняет целевую платформу на net8.0-windows, включает UseWindowsForms, переносит ссылки из packages.config в PackageReference и подменяет известные пакеты совместимыми версиями.
Инструмент не переписывает логику и не гарантирует, что результат соберётся. Его задача снять механическую работу с файлом проекта. После него остаётся список предупреждений, и с ним стоит работать как с планом задач. Начинайте с библиотек классов, от которых ничего не зависит, и только потом переходите к EXE-проекту с формами.
Перед запуском убедитесь, что решение собирается и проходит тесты на .NET Framework, сделайте отдельную ветку и зафиксируйте версии всех сторонних сборок. Откатываться потом будет проще.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<MyType>WindowsForms</MyType>
<RootNamespace>Billing</RootNamespace>
<OptionStrict>On</OptionStrict>
<OptionInfer>On</OptionInfer>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.2" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.1" />
</ItemGroup>
</Project>Что переносится без проблем
Сам язык и библиотека Microsoft.VisualBasic работают в современном .NET: функции Left, Mid, InStr, Format, CInt, Val и прочие привычные вызовы на месте. Модель Application Framework тоже поддерживается: события Startup, Shutdown, UnhandledException в ApplicationEvents.vb, режим одного экземпляра и экран-заставка.
Пространство My работает частично. My.Settings, My.Resources, My.Application, My.Computer.FileSystem, My.Computer.Clipboard и My.Computer.Registry доступны. Дизайнер форм для VB.NET в Visual Studio 2022 работает с проектами на современном .NET, хотя устроен иначе, чем раньше: он запускается в отдельном процессе, и сторонние контролы со своими дизайнерами должны быть обновлены вендором под эту модель.
Что сломается почти наверняка
Эти пункты стоит проверить по коду до начала работ, поиском по решению. Обычно на них приходится основная часть ручной доработки.
- контролы DataGrid, MainMenu, ContextMenu, StatusBar и ToolBar убраны из WinForms ещё в .NET Core 3.1, их заменяют DataGridView, MenuStrip, ContextMenuStrip, StatusStrip и ToolStrip;
- My.WebServices в современном .NET отсутствует, а отдельные члены My.Computer недоступны или ведут себя иначе, их список стоит сверить с документацией Microsoft;
- библиотека Microsoft.VisualBasic.Compatibility с наследием мастера миграции VB6 не перенесена, массивы контролов и функции вроде VB6.Format придётся переписать;
- System.Data.SqlClient заменяется пакетом Microsoft.Data.SqlClient, а у него с версии 4.0 Encrypt по умолчанию включён, и подключение к серверу с самоподписанным сертификатом начнёт падать;
- .NET Remoting, создание дополнительных AppDomain и Code Access Security в современном .NET отсутствуют;
- серверная часть WCF не поддерживается, клиент WCF доступен через пакеты System.ServiceModel.*.
BinaryFormatter и ресурсы форм
Отдельная ловушка связана с сериализацией. BinaryFormatter в .NET 8 помечен устаревшим, но для WinForms-приложений ещё работает. В .NET 9 его реализация удалена, и вызов Serialize или Deserialize выбрасывает исключение. Если приложение сохраняет настройки, кэш или буфер обмена через BinaryFormatter, это нужно переделать до перехода на версию новее восьмой.
Менее очевидное место это .resx-файлы форм. Свойства нестандартных типов (например, ImageList или пользовательские объекты в Tag) дизайнер старых версий мог сохранить как сериализованный двоичный блок. Команда WinForms переписала чтение таких ресурсов без BinaryFormatter для типичных случаев, но экзотические типы стоит проверить, открыв каждую форму в дизайнере и прогнав приложение.
Сторонние компоненты и развёртывание
Чаще всего перенос тормозят не собственный код, а сторонние библиотеки. Наборы контролов DevExpress, Telerik, Infragistics и подобные выпускают версии для современного .NET, но лицензия старой версии может на них не распространяться. Компоненты без поддержки, особенно ActiveX, обёрнутые через AxHost, работают только в процессе той же разрядности, поэтому проект с ними придётся собирать под x86.
Crystal Reports for Visual Studio современный .NET не поддерживает, и приложениям с отчётами понадобится замена движка. Это отдельный большой кусок работы, его стоит оценить до старта.
Развёртывание тоже меняется. Можно публиковать приложение как зависимое от установленной среды выполнения или как самодостаточное, с runtime внутри папки. ClickOnce для современного .NET поддерживается через профиль публикации Visual Studio, но конфигурация в app.config читается только при подключённом пакете System.Configuration.ConfigurationManager.
Порядок работ, который экономит время
Мультитаргетинг позволяет переносить приложение частями: общие библиотеки собираются под обе платформы, старая версия продолжает работать, пока новая доводится до готовности.
- вынести бизнес-логику в библиотеки классов и перевести их на .NET Standard 2.0 или мультитаргетинг net48 и net8.0;
- покрыть эти библиотеки тестами и прогнать их на обеих платформах;
- обновить EXE-проект с формами Upgrade Assistant и разобрать предупреждения;
- открыть каждую форму в дизайнере, проверить масштабирование на 100, 150 и 200 процентах;
- пустить пилотную группу пользователей на новую сборку, оставив старую рядом.
Как это делают сегодня
Вопросы и ответы
Работает ли дизайнер форм VB.NET для .NET 8?
Да, в Visual Studio 2022 дизайнер WinForms поддерживает VB-проекты на современном .NET. Сторонние контролы с собственными дизайнерами должны иметь версию, совместимую с новым внепроцессным дизайнером.
Можно ли оставить проект 32-битным?
Да. Укажите PlatformTarget x86 в файле проекта. Это нужно, если приложение загружает 32-битные COM-компоненты или ActiveX.
Стоит ли целиться в .NET 8, если его поддержка скоро закончится?
Для нового переноса лучше выбрать .NET 10 LTS. Переход между версиями современного .NET обычно сводится к смене TargetFramework и обновлению пакетов.