До каких пор будут работать приложения VB6 ── состояние поддержки среды выполнения и практичный путь миграции на .NET

· · VB6, .NET, C#, Устаревшие технологии, Использование существующих активов, Миграция, Модернизация, 32-бит, Разработка под Windows, Таблица решений, Техническая консультация

«До каких пор будет работать эта система на VB6?» — один из самых частых вопросов на консультациях по устаревшим системам.

Ответ на удивление однозначен: Microsoft официально опубликовала политику поддержки. Но её содержание асимметрично — «среда выполнения ещё какое-то время проработает, но опоры со стороны разработки уже нет». Без правильного понимания этой асимметрии легко скатиться к одной из двух крайностей: «раз ещё работает, значит всё в порядке» или «нужно всё переделывать прямо сейчас».

В этом блоге в статье «Продление жизни и миграция бизнес-приложений VB6 / Access ── таблица решений «оставить, обернуть или заменить»» мы систематизировали подход к тому, как поступить с активами VB6. Эта статья — продолжение: после того как решение «заменить (мигрировать)» принято — или чтобы его принять, — она углубляется в то, как на практике провести миграцию с VB6 на .NET.

1. Сначала — суть

  • Поддержка IDE VB6 (среды разработки) завершилась 8 апреля 2008 года. Больше не существует поддерживаемого способа создавать или сопровождать приложения VB6, и Microsoft настоятельно рекомендует переходить на современные технологии.1
  • С другой стороны, среда выполнения VB6 поддерживается «пока поддерживается версия Windows, с которой она поставляется». В список охватываемых версий ОС входят Windows 11, Windows 10 и Windows Server 2025, а цель состоит в том, чтобы существующие приложения просто продолжали работать (It Just Works).2 Иными словами, ответ на вопрос «до каких пор будет работать» звучит так: если говорить только об исполнении — пока поддерживается сама Windows.
  • Однако эта поддержка ограничена устранением серьёзных регрессий и критических проблем безопасности в существующих приложениях. Кроме того, среда выполнения предназначена только для 32-битных систем, а в 64-битной Windows поддерживается лишь внутри среды WOW64.2
  • Настоящий риск — не «перестанет работать», а утрата возможности что-либо исправить. Получить и сохранить IDE с каждым годом становится всё труднее, поддержка производителей используемых OCX-компонентов прекращается, а люди, ещё способные писать на VB6, уходят на пенсию или меняют работу. Все три процесса развиваются независимо от срока поддержки самой Windows.
  • Существует три общих подхода к миграции: полная переписка, автоматическое преобразование и поэтапная миграция. Первое, что нужно решить, — не подход, а инвентаризация: прежде чем выбирать подход, нужно оценить количество экранов, внешних интеграций, объём OCX-компонентов и объявлений API.
  • В качестве целевого языка миграции для всего нового кода рекомендуется C#. Microsoft официально заявила, что VB.NET (Visual Basic) находится на пути стабильного развития, без нового синтаксиса и без расширения на новые типы нагрузок.3

2. Точный ответ на вопрос «до каких пор будет работать» ── как читать политику поддержки

Политика поддержки VB6 от Microsoft описывает VB6 через три компонента.2

Компонент Что это Статус поддержки
IDE VB6 Среда разработки (Visual Studio 6.0) Завершилась 8 апреля 2008 года
Среда выполнения VB6 Исполняемая основа, поставляемая вместе с ОС (msvbvm60.dll и другие) Поддерживается, пока поддерживается версия Windows, с которой она поставляется
Файлы расширения среды выполнения Основные элементы управления OCX (распространяются вместе с приложением) То же самое (распространение обеспечивает само приложение)

В таблице охватываемых версий ОС для Windows 11, Windows 10 и Windows Server с 2012 по 2025 годы явно указано «среда выполнения: поддерживается», «IDE: не поддерживается».2

Есть три ключевых момента для правильного прочтения этой политики.

Во-первых, поддержка среды выполнения полностью подчинена жизненному циклу Windows. Не существует отдельной даты под названием «дата окончания поддержки среды выполнения VB6» — окончание поддержки используемой версии Windows и есть срок как таковой.

Во-вторых, содержание поддержки ближе к гарантии того, что «всё продолжит работать», чем к чему-либо ещё. Обрабатываются только серьёзные регрессии (когда обновление ОС ломает существующее приложение) и критические проблемы безопасности; отдельные расследования или улучшения функциональности сюда не входят.2

В-третьих, приложения VB6 и впредь смогут существовать только как 32-битные процессы. Среда выполнения предназначена только для 32-битных систем, а на 64-битных ОС поддерживается лишь внутри среды эмуляции WOW64.2 В момент, когда возникает необходимость взаимодействовать с исключительно 64-битной DLL или SDK, один процесс уже не может решить задачу самостоятельно. О том, как преодолеть это препятствие, мы рассказали в статье «Пример COM-моста для вызова 64-битной DLL из 32-битного приложения».

3. «Работает» и «поддерживаемо» — разные вопросы

Если смотреть только на политику поддержки, может показаться, что «спешить некуда». Но на практике среда разработки и сопровождения разрушается гораздо раньше, чем среда выполнения.

  • Невозможно раздобыть IDE. IDE VB6 не поддерживается на современных ОС, и поддерживать официальный способ её получения и установки с каждым годом всё труднее. Ситуация, когда «во всей компании есть только одна машина, на которой ещё можно что-то исправить», встречается нередко.
  • Поддержка производителей сторонних OCX-компонентов прекращена. Сама политика поддержки прямо указывает, что элементы управления сторонних производителей относятся к зоне ответственности поставщика.2 Нередко OCX-компоненты для таблиц или отчётов уже невозможно получить, и подход, который мы систематизировали в статье «Как сегодня поступать с ActiveX / OCX», применим здесь напрямую.
  • Исчезают люди, способные писать код. Это не проблема языковой спецификации, а кадровая проблема. Новых инженеров, изучающих VB6, практически нет, поэтому число людей, способных заниматься сопровождением, только сокращается.
  • Смежные требования упираются в стену 32-бит. Новые SDK для оборудования, библиотеки аутентификации, облачные интеграции всё чаще исходят из предположения о 64-битности и .NET, и требований, которые невозможно встроить в процесс VB6, становится всё больше.

Иными словами, «до каких пор будет работать» — лишь половина проблемы. Вторая половина: «останутся ли, когда потребуется следующее исправление, люди и среда, способные его сделать». План миграции нужно составлять не после того, как что-то сломается, а пока ещё остаются люди и среда, способные всё исправить.

4. Таблица решений для подходов к миграции

Даже после принятия решения «заменить» способов реализации остаётся достаточно много. Приведём обзор основных подходов.

Подход Описание Хорошо подходит для Основные риски
Полная переписка Пересмотреть спецификацию и построить систему заново на .NET Мало экранов / хочется пересмотреть сам бизнес-процесс / спецификацию можно объяснить Пропуск скрытых бизнес-правил, затягивающийся период параллельной разработки
Инструмент автоматического преобразования Механическое преобразование кода VB6 в код .NET инструментом с последующей доработкой людьми Большой объём кода, желание сохранить логику как есть / без изменения компоновки экранов Качество и читаемость преобразованного кода, ручная работа, которая всё равно остаётся, стоимость инструмента
Поэтапная миграция (паттерн «удавка») Выделение функциональности по частям и последовательная замена при сосуществовании старого и нового Бизнес нельзя останавливать / много экранов и функций / нужно распределить риск Сложность периода сосуществования старого и нового, требует сильных навыков проектирования на границе (в точках интеграции)
Сохранение текущего состояния + документирование Не мигрировать; продлить срок службы за счёт фиксации среды, резервного копирования и документирования Практически нет запросов на изменения / машину и ОС можно зафиксировать Риски из предыдущей главы не устраняются (просто откладываются)

Выбор определяется не только количеством строк кода. Сама Microsoft, помимо официальных руководств, при миграции направляет пользователей к партнёрам по обновлению и миграции (включая поставщиков инструментов миграции)1, так что механическое преобразование — вполне реальный, рабочий вариант. Тем не менее, независимо от выбранного подхода, инвентаризация из следующей главы остаётся общим обязательным условием.

Отметим, что практические аспекты выбора варианта «сохранить как есть + документировать» (фиксация среды выполнения, резервное копирование, способ принятия риска) рассмотрены в предыдущей статье о VB6 / Access.

5. Инвентаризация перед миграцией ── что изучить прежде, чем трогать код

Точность оценки и выбора подхода полностью зависит от точности инвентаризации. Как минимум составьте списки следующего.

  1. Список экранов и отчётов ── количество форм, реально используемые экраны (миграция неиспользуемых экранов — потраченные впустую усилия), типы отчётов и место их вывода (прямая печать на принтере или через Excel)
  2. Список внешних интеграций ── какая из технологий ADO/DAO/RDO используется для базы данных и к чему она подключается, файловый ввод-вывод, последовательная или сокетная связь, вызовы других систем
  3. Список ссылок на OCX / ActiveX / COM ── их можно механически извлечь из ссылок файла проекта (.vbp). Возможность получения каждого компонента и наличие альтернативы напрямую влияют на выбор подхода
  4. Список объявлений Win32 API (операторов Declare) ── классифицируйте каждое по назначению API (печать, чтение/запись INI-файлов, манипуляции с окнами и т. д.) и определите, можно ли заменить его стандартной функциональностью .NET
  5. Бизнес-правила, существующие только в коде ── обработка округлений, даты закрытия периодов, исключения по конкретным контрагентам и тому подобное. Места, где «никто не знает, почему это написано именно так», — как раз то, где чаще всего заводятся баги после миграции
  6. Наличие способа тестирования ── с чем сравнивать поведение после миграции, чтобы подтвердить его корректность. В большинстве случаев сверка с выходными данными старой системы (отчётами, CSV, содержимым базы данных) — самый практичный способ проверки

Эта инвентаризация не пропадёт впустую, даже если в итоге выбрана не полная переписка. Более того, обычно именно по результатам инвентаризации обнаруживается зацепка для поэтапной миграции — «мы думали, что нужна полная переписка, но на самом деле основную логику можно перенести на сторону базы данных» или «достаточно сначала перенести только эти десять экранов, чтобы преодолеть стену 64-бит».

6. Основные точки несовместимости VB6 и .NET

VB6 и VB.NET/C# — языки, более далёкие друг от друга, чем можно подумать по названиям. И при механическом преобразовании, и при ручной переписке следующие различия неизбежно потребуют проектных решений.

Область VB6 .NET Практические замечания
Обработка ошибок On Error GoTo / Resume Структурированные исключения (Try...Catch) Простая замена невозможна. Нужно уточнить спецификацию везде, где ошибки «проглатывались, и выполнение продолжалось»
Типы Variant, Integer — 16-бит В основном статическая типизация, Integer — 32-бит Выявить код, зависящий от неявного преобразования. Разница в размере числовых типов — классический источник багов совместимости
Свойства по умолчанию Сокращённая запись вида Text1 = "abc" Упразднены (требуется явное указание) Частое место ошибочной интерпретации инструментами преобразования. Обратите внимание на код, где размыта граница между присваиванием объекта и присваиванием значения
Доступ к данным ADO / DAO / RDO ADO.NET и более поздние версии Концепции соединения, транзакции и курсора совершенно иные. Слой данных следует не «преобразовывать», а проектировать заново
Экраны Формы VB6 + OCX WinForms / WPF Элементы управления не соответствуют друг другу один к одному. Для OCX вроде таблиц (grids) требуется выбрать замену
Печать и отрисовка Объект Printer, прямая отрисовка на форме GDI+ / API печати Отчёты — область, где трудозатраты на миграцию сложно оценить. Переход на отчёты в Excel — тоже вариант
Запуск и развёртывание EXE + среда выполнения + регистрация OCX Возможно и автономное (self-contained) развёртывание Уход от эксплуатации, предполагающей регистрацию в реестре (regsvr32), — одно из преимуществ миграции

Важно здесь не позволить объёму несовместимостей подавить вас настолько, чтобы полная переписка казалась единственным вариантом. Напротив, сам факт, что активы в левой части этой таблицы (VB6) до сих пор корректно работают, — лучшая спецификация, какая только может быть при миграции. Запуск старой системы параллельно как «работающей спецификации» и сверка выходных данных по ходу дела на практике оказывается самым надёжным путём.

7. Практические паттерны поэтапной миграции

При миграции без остановки бизнеса ключевым становится то, как сосуществуют старая и новая система. Рассмотрим три типичных паттерна.

7.1 Сначала перенести слой данных

В этой схеме данные приложения VB6 сначала переносятся из файла Access или собственного формата в, например, SQL Server, а сторона VB6 продолжает работать, просто переключив цель подключения. Как только данные модернизированы в первую очередь, новые экраны (на стороне .NET) можно добавлять постепенно, обращаясь к той же базе данных. Конкретные шаги, связанные с Access, см. в главе о повышении уровня (upsizing) предыдущей статьи.

7.2 Строить новые функции и экраны на .NET, связывая их через COM-взаимодействие

Это схема, при которой существующие экраны VB6 остаются как есть, а новая функциональность строится на .NET и сосуществует с ними. Возможны два направления.

  • Вызывать компоненты на стороне .NET из VB6: если открыть класс .NET как COM, VB6 сможет ссылаться на него как на обычный COM-компонент. О том, как открывать его типизированно даже на .NET 8 и более поздних версиях, мы рассказали в статье «Типизированный вызов DLL на .NET 8 из VBA ── dscom и TLB»; тот же подход применим, даже если вызывающая сторона — VB6, а не VBA.
  • Вызывать активы на стороне VB6 из .NET: ActiveX DLL, созданная в VB6, может быть подключена из .NET через COM-взаимодействие. Это применяется, когда логику хочется сохранить целиком, модернизируя на .NET сначала только экраны. Однако ограничение 32-бит при этом сохраняется, поэтому такой вариант следует рассматривать как мост на период миграции, а не как постоянное решение.

7.3 Разделить процессы и связать их между собой

Размещение старого и нового в одном процессе через COM-взаимодействие упирается в ограничения, связанные с разрядностью (32-бит/64-бит) и распространением сбоев. Когда нужна новая 64-битная функциональность или желательно изолировать сбои старой и новой части друг от друга, их разделяют на отдельные процессы и связывают через файлы, именованные каналы, связь через localhost и тому подобное. Варианты межпроцессной интеграции мы обобщили в статье «Таблица решений по IPC в Windows», а конкретный пример моста 32-бит→64-бит — в «Примере COM-моста».

Принцип, общий для всех паттернов: «собрать границу между старым и новым в одном месте и зафиксировать формат данных, пересекающих эту границу». Если границы бесконтрольно множатся от экрана к экрану или от функции к функции, стоимость периода сосуществования съедает всю пользу от миграции.

8. Целевой язык миграции ── C# или VB.NET

Часто кажется, что «раз переходим с VB6, естественным выбором будет VB.NET», но с учётом текущей языковой стратегии Microsoft всё не так просто.

Официальная языковая стратегия позиционирует Visual Basic (VB.NET) как «понятный и привычный язык, сохраняющий стабильный дизайн», и прямо заявляет, что новые функции, как правило, ограничиваются потреблением (consumption-only), новый синтаксис добавляться не будет, а расширения на новые типы нагрузок не произойдёт. При этом инвестиции в ключевые сценарии, такие как Windows Forms и библиотеки, а также улучшение опыта разработки в Visual Studio, как утверждается, продолжатся.3

С точки зрения миграции это можно прочитать следующим образом.

  • Даже если выбрать VB.NET, существующие сценарии (бизнес-приложения на WinForms) в обозримом будущем будут продолжать работать без проблем. Для команд с большим числом людей, имеющих опыт работы с VB6, где близость синтаксиса снижает затраты на обучение, это разумный выбор.
  • Тем не менее, в качестве основы для всего, что пишется заново отныне, рекомендуется C#. Его язык и экосистема продолжают развиваться, а предложение примеров, библиотек и кадров сконцентрировано вокруг C#. Это выбор, сделанный для того, чтобы через десять лет не повторить проблему «некому поддерживать VB6» в виде проблемы «некому поддерживать VB.NET».
  • В качестве компромисса можно также принимать результат работы инструмента преобразования на VB.NET, а новую разработку вести на C#. В .NET сборки обоих языков могут ссылаться друг на друга, поэтому смешение языков само по себе препятствием не является.

По выбору фреймворка интерфейса (WinForms / WPF / WinUI) см. «Таблицу решений для WinForms, WPF и WinUI», а о том, что нужно проверить при миграции напрямую на текущий .NET, минуя .NET Framework, — «Чек-лист перед миграцией с .NET Framework на .NET». Специально принимать .NET Framework 4.8 в качестве новой цели при миграции с VB6 нет никакого смысла, если только этого не требуют ограничения используемых библиотек.

9. Итоги

  • Ответ на вопрос «до каких пор будет работать VB6» такой: среда выполнения поддерживается, пока поддерживается сама Windows (включая Windows 11). Но поддержка IDE завершилась ещё в 2008 году, поэтому официальной опоры для пересборки или исправления кода уже нет — это асимметричное положение дел.21
  • Настоящий срок определяется не операционной системой, а тем, остаются ли среда и люди, способные всё исправить. Составляйте план миграции не после того, как что-то сломается, а пока старую систему ещё можно использовать как «работающую спецификацию».
  • Есть три подхода: полная переписка, автоматическое преобразование и поэтапная миграция. Прежде чем выбрать один из них, проведите инвентаризацию экранов, внешних интеграций, OCX-компонентов, объявлений API и бизнес-правил, существующих только в коде.
  • Для миграций, которые не могут остановить бизнес, используйте приоритет слоя данных, COM-взаимодействие или разделение процессов, чтобы обеспечить сосуществование старого и нового, и соберите границу в одном месте.
  • Для всего, что пишется заново, рекомендуется C#. Курс на стабильность VB.NET — официальная политика3, а C# имеет преимущество как основа для долгосрочного сопровождения.

Похожие статьи

Смежные области консультирования

KomuraSoft LLC (合同会社小村ソフト) занимается инвентаризацией существующих активов, включая VB6, и разработкой стратегии миграции, проектированием и реализацией архитектур сосуществования старой и новой систем через COM-мосты и разделение процессов, а также поэтапной заменой систем на .NET.

Справочные ссылки

  1. Microsoft Learn, Visual Basic 6.0 Support Announcement. О том, что поддержка IDE VB6 / IDE Visual Studio 6.0 завершилась 8 апреля 2008 года, что не существует поддерживаемого способа создавать или сопровождать приложения VB6, из-за чего настоятельно рекомендуется переход на современные технологии, и о том, что при миграции предоставляются руководства по обновлению и партнёры по миграции.  2 3

  2. Microsoft Learn, Support Statement for Visual Basic 6.0 on Windows. О том, что среда выполнения VB6 поддерживается, пока поддерживается версия Windows, с которой она поставляется, что Windows 11, Windows 10, Windows Server 2025 и другие входят в число охватываемых ОС, что область поддержки ограничена серьёзными регрессиями и критическими проблемами безопасности, что среда выполнения предназначена только для 32-бит и на 64-битных ОС поддерживается лишь в среде WOW, а также что элементы управления сторонних производителей относятся к зоне ответственности поставщика.  2 3 4 5 6 7 8

  3. Microsoft Learn, Annotated Visual Basic language strategy и Microsoft .NET language strategy. О том, что Visual Basic сохраняет стабильный дизайн, что новые функции сосредоточены на потреблении (consumption-only) и избегают добавления нового синтаксиса, что расширения на новые типы нагрузок не произойдёт, и что инвестиции в ключевые сценарии, такие как Windows Forms и библиотеки, а также в опыт работы с Visual Studio, продолжатся.  2 3

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Значки в области уведомлений и всплывающие (toast) уведомления в Windows-приложениях — подводные камни NotifyIcon и выбор правильного AppNotification

Практическое руководство о том, как удерживать бизнес-приложение Windows в области уведомлений (system tray) и оповещать пользователя с п...

Японская эра, праздники и даты закрытия периода в бизнес-приложениях — устойчивый к смене эры дизайн, JapaneseCalendar и расчёт рабочих дней на практике

Показать «Рэйва 8» в отчёте, рассчитать рабочие дни без учёта праздников, оплатить в последний рабочий день месяца, следующего за закрыти...

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

Будут ли приложения VB6 работать в Windows 11?
Да, они находятся в рамках поддержки. Согласно политике поддержки Microsoft, среда выполнения VB6 (msvbvm60.dll и сопутствующие файлы) остаётся поддерживаемой, пока поддерживается версия Windows, с которой она поставляется, а в список охватываемых версий ОС входят Windows 11, Windows 10 и Windows Server 2025. Однако эта поддержка ограничена устранением серьёзных регрессий и критических проблем безопасности в существующих приложениях. Кроме того, среда выполнения VB6 предназначена только для 32-битных систем, а в 64-битной Windows она поддерживается лишь внутри среды совместимости WOW64.
Можно ли завершить миграцию с VB6 на .NET, используя только инструмент автоматического преобразования?
Правильнее исходить из того, что нельзя. Инструменты преобразования могут снизить трудозатраты на переписывание определений экранов и простой логики, но такие вещи, как обработка ошибок через On Error, код, зависящий от типа Variant или свойств по умолчанию, элементы управления ActiveX и объявления Win32 API, требуют ручных проектных решений и доработки. Вместо того чтобы сразу внедрять в продакшен необработанный результат работы инструмента, нужно оценивать весь проект целиком, включая 'человеческую доработку после преобразования', и заранее определить способ проверки результата преобразования — например, параллельную работу или сравнение выходных данных.
Что выбрать целевым языком миграции — VB.NET или C#?
Для всего, что пишется заново, рекомендуется C#. Языковая стратегия Microsoft позиционирует Visual Basic (VB.NET) как язык, сохраняющий стабильный дизайн, и прямо заявляет, что новый синтаксис добавляться не будет и расширения на новые типы нагрузок не произойдёт. Инвестиции в существующие сценарии, такие как Windows Forms, продолжатся, поэтому VB.NET не станет непригодным для использования, но как основа для кода, который придётся поддерживать следующие десять лет, C# — язык и экосистема которого продолжают развиваться — имеет преимущество с точки зрения доступности кадров. Команды с большим числом разработчиков, имеющих опыт работы с VB6, вполне могут разумно выбрать VB.NET благодаря близости синтаксиса.
Что нужно сделать в первую очередь перед полной переписью?
Перед тем как писать хотя бы одну строку кода, необходимо провести инвентаризацию. А именно: список экранов и отчётов, список внешних интеграций (базы данных, файлы, последовательная связь, другие системы), список используемых элементов управления OCX/ActiveX и COM-компонентов, список объявлений Win32 API (операторов Declare), а также перечень бизнес-правил, существующих только в коде. Результаты этой инвентаризации очень часто показывают, что поэтапная миграция — выделение лишь части системы или перенос сначала слоя данных — реалистичнее, чем полная переписка.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог