Как долго проработают приложения VB6 — поддержка среды выполнения и миграция на .NET

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

История изменений (2 обновлений, последнее 30 Aug 2026)

Журнал изменений этой статьи. Там, где версия до правки была заархивирована, она остаётся доступной для чтения по постоянной ссылке с DOI.

Карта знаний: метка COM Interop приведена к каноническому узлу. Утверждения статьи не менялись.
Русский текст переписан как полноценный технический перевод, а не калька с японского. Утверждения статьи не менялись.
Первая публикация
Цитирование статьи(DOI (зарегистрированный архив): 10.5281/zenodo.21620029)

Приведённые ниже DOI относятся к ранее зарегистрированным архивным версиям, которые могут отличаться от текущего текста. Для ссылки на текущий текст используйте URL этой страницы.

Го Комура (2026). Как долго проработают приложения VB6 — поддержка среды выполнения и миграция на .NET. KomuraSoft LLC. https://comcomponent.com/ru/blog/vb6-to-dotnet-migration-practical-guide/

DOI (зарегистрированный архив)
10.5281/zenodo.21620029
DOI (последняя зарегистрированная версия)
10.5281/zenodo.21620030

«Как долго ещё проработает эта система на VB6?» — один из самых частых вопросов на консультациях по действующим системам.

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

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

Термины, которые встречаются в статье

Читатель может не застать эпоху VB6, поэтому сначала зафиксируем словарь.

Термин Что это
WOW64 Windows 32-bit On Windows 64-bit. x86-эмулятор, который на 64-битной Windows запускает 32-битные приложения как есть. Входит в состав ОС, включать его отдельно не нужно. Важное ограничение: 32-битный процесс не может загрузить 64-битную DLL для выполнения, и наоборот1
OCX OLE Control Extension. Формат и расширение файла элементов ActiveX (экранных компонентов на COM). Экраны VB6 часто сильно зависят от OCX: сетки, календари и тому подобное
ActiveX DLL COM-компонент без экрана, который можно собрать в VB6. Им выносили бизнес-логику в отдельные части
Взаимодействие с COM (COM interop) Механизм взаимных вызовов между .NET и COM-компонентами. Есть оба направления: опубликовать тип .NET как COM и вызвать COM-компонент из .NET (раздел 7.2)
Strangler Fig Паттерн поэтапной миграции. Перед существующей системой ставят фасад, функции по одной переносят в новую систему и в итоге оставляют старую без работы и выключают. Название — от фикуса-удушителя (strangler fig): он обвивает дерево-хозяина и со временем полностью его замещает2
Оператор Declare Объявление прямого вызова Win32 API из VB6. При миграции это позиция для сортировки: «заменяется ли стандартными средствами .NET» (глава 5)
ADO / DAO / RDO Технологии доступа к данным эпохи VB6. На стороне .NET — ADO.NET и далее; модель другая, простой заменой не обойтись (глава 6)

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

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

На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 22, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle

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

Политика поддержки VB6 от Microsoft разбирает продукт на три части.4

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

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

Читать это нужно в трёх пунктах.

Первое: поддержка среды выполнения полностью подчинена жизненному циклу Windows. Отдельной даты «окончание поддержки среды выполнения VB6» нет: срок — это окончание поддержки той Windows, на которой вы работаете.

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

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

3. «Запускается» и «можно сопровождать» — разные вещи

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

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

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

4. Таблица выбора схемы миграции

Даже после решения «заменить» способов провести работу несколько. Основные схемы такие.

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

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

4.1 Что конкретно имеется в виду под «конвертером»

«Инструмент автопреобразования» звучит как один класс продуктов, но Microsoft публикует страницу, где партнёрские продукты для VB6 названы прямо. Формулировка: бесплатные и платные инструменты и решения партнёров, которые помогают полнее перейти с Visual Basic 6.0 на Visual Basic .NET. Перечислены три.6

Инструмент Как его описывает официальная страница
Mobilize.Net Visual Basic Upgrade Companion (VBUC) Ведущий отраслевой инструмент миграции с VB6 на .NET; есть опыт перевода миллионов строк на C# и VB.NET и снятия зависимости от сторонних компонентов. Есть и бесплатная редакция
Great Migrations Studio (gmStudio) Среда реинжиниринга, в которой процедуру обновления с VB6 / ASP / COM на .NET прорабатывают целиком: план, настройка, доработка, проверка, отслеживание
VB Migration Partner Инструмент переноса приложений VB6 на VB.NET или C#. Почти полностью покрывает функции и элементы VB6; характерный приём — «Convert-Test-Fix»: сгенерированный код настраивают, синхронизируя его с исходным проектом VB6

Это краткий пересказ формулировок со страницы Microsoft, а не наша рекомендация и не гарантия. Выбирайте только после прогона на своём коде. Смотреть стоит на следующее.

Критерий Что проверить
Язык на выходе Есть ли C#, или только VB.NET. Не расходится ли это с языковой политикой из главы 8
Целевой .NET Выдаёт ли текущий .NET (.NET 8 и аналоги) или останавливается на .NET Framework
Зависимость от библиотеки поставщика Не ссылается ли полученный код на собственную библиотеку поддержки поставщика инструмента. Если ссылается — будут ли её сопровождать дальше (не появилась ли новая привязка к поставщику)
OCX Есть ли замена для используемых OCX или это ручная работа
Как считают «процент преобразования» Знаменатель у «95%» — строки или синтаксические элементы. Оставшиеся 5% обычно как раз самые трудные места, поэтому важнее не процент, а список того, что осталось
Можно ли попробовать Прогоняется ли на реальном своём коде. Какой потолок строк у бесплатной или ознакомительной редакции
Единица цены По строкам, за проект или вместе с консалтингом
Можно ли повторять Преобразование один раз и всё — или можно гонять снова, подхватывая правки на стороне старого VB6

Последний пункт часто пропускают. Пока идёт миграция, на стороне VB6 всё равно чинят сбои. Если инструмент умеет преобразовать только один раз, каждую такую правку придётся вносить руками и в старое, и в новое.

Практику варианта «оставить как есть и задокументировать» (фиксация среды выполнения, резервные копии, как принимают риск) мы разбирали в предыдущей статье про 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-битный барьер уже обойден».

5.1 Что стоит за «можно извлечь автоматически» — ссылки из .vbp

В пункте 3 сказано: «из ссылок .vbp можно извлечь автоматически». Вот как именно.

Файл проекта (.vbp) — текстовый файл в ASCII. В официальной документации Microsoft есть пример содержимого; ссылки записываются одной строкой такого вида.7

Type=Exe
Form=B_Form.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\WINDOWS\SYSTEM\STDOLE2.TLB#OLE Automation
Form=A_Form.frm
Module=CModule; C_Module.bas
Class=DClass; D_Class.cls
Startup="BForm"
Name="Project1"

Значение Reference= разделено #: GUID (идентификатор библиотеки типов) → версия → локаль → путь к файлу → описание (имя библиотеки). В примере описание — OLE Automation. Элементы ActiveX (OCX), поставленные на форму, пишутся строками Object=. Соберите оба вида строк — получите список внешних компонентов, от которых зависит проект.

Если проектов десятки, выгрузить всё разом можно таким скриптом.

# Из всех .vbp в папке и подпапках вынуть строки ссылок на компоненты и сохранить в CSV
# Среда: Windows PowerShell 5.1
Get-ChildItem -Path . -Filter *.vbp -Recurse | ForEach-Object {
    $project = $_.FullName
    Get-Content -LiteralPath $project | Where-Object {
        $_ -like 'Reference=*' -or $_ -like 'Object=*'
    } | ForEach-Object {
        $kind, $value = $_ -split '=', 2
        [pscustomobject]@{
            Project = $project
            # Reference = подключённая библиотека типов; Object = элемент ActiveX на форме
            Kind    = $kind
            Entry   = $value
        }
    }
} | Sort-Object Kind, Entry | Export-Csv .\vb6-components.csv -NoTypeInformation -Encoding UTF8

Уберите дубликаты в получившемся CSV — за полдня будет список: «от каких COM-компонентов эта система в итоге зависит». Дальше по каждой строке заполняете: можно ли достать, есть ли поддержка поставщика, есть ли замена на стороне .NET. Эта таблица и есть основа выбора схемы и оценки из главы 4.

Тем же приёмом собирается список Declare: по .bas / .frm / .cls выбрать строки, в которых есть Declare. Вручную в инвентаризации нужно разбирать только бизнес-правила, которые живут в коде; остальное почти всё автоматизируется.

5.2 Как оценивать трудозатраты и сроки

Цифра «N дней на один экран» легко прыгает на порядок: сложность экрана, наличие OCX, плотность бизнес-логики, жёсткость тестов. Чужие цифры «с чужого проекта» не попадут. Вместо этого соберите свои.

  1. Посчитать. По инвентаризации зафиксируйте число экранов, отчётов, внешних связей, типов OCX, операторов Declare, таблиц.
  2. Разложить по сложности. Экраны — примерно на три ступени (простой список / просмотр; ввод с проверками; экран с сеткой или предварительным просмотром отчёта).
  3. С каждой ступени взять по одному экрану и реально перенести (пилот). Замерить фактическое время, включая проектирование, реализацию, модульные тесты и сверку выхода со старой системой. Это и будет расценка для оценки.
  4. Умножить и сложить. Расценку из пункта 3 умножить на число экранов из пункта 2 и сложить.
  5. Добавить отдельные статьи. Общее (аутентификация, журналы, печать, распространение, подготовка среды) и время на расшифровку «правил, которые живут только в коде» не пропорциональны числу экранов. Оценка без этих статей всегда занижена.
  6. Если не сходится — вернуться к схеме. Если пилот вышел заметно хуже ожидания, это не погрешность оценки, а сигнал, что схему выбрали не ту. Вернитесь к главе 4 и заново выберите между переписыванием с нуля, автопреобразованием и поэтапной миграцией.

Главное: опирайте оценку не на чужие цифры, а на свой пилотный замер. Пилот — не расход, а вложение в точность оценки.

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 вроде сеток нужна замена
Печать и отрисовка Объект Printer, прямая отрисовка на форме GDI+ / API печати Отчёты — область, где трудозатраты плохо читаются заранее. Сдвиг на отчёты в Excel — тоже вариант
Запуск и распространение EXE + среда выполнения + регистрация OCX Возможно и автономное (self-contained) развёртывание Уйти от эксплуатации, где всё держится на регистрации в реестре (regsvr32), — одно из преимуществ миграции

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

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

Если бизнес останавливать нельзя, нужна конфигурация, в которой старое и новое живут вместе. Типичных схем три. Различие в одном: где проходит граница между старым и новым.

Три схемы поэтапной миграции с VB6 на .NETГраница между старым и новым может проходить по базе данных, по COM-интерфейсу в одном процессе или по IPC между процессами7.3 Разнести по процессам — граница это IPC, разные процессыИменованный канал / файл / связь через localhostПриложение VB6 — 32-битный процессПриложение .NET — может быть 64-битным7.2 Связка через взаимодействие с COM — граница это COM-интерфейс, один процессCOM-интерфейсПриложение VB6 — 32-битный процессКомпонент .NET — его нужно собрать как 32-битный7.1 Сначала слой данных — граница это база данныхБаза после миграции — SQL Server и аналогиПриложение VB6 — меняется только строка подключенияНовые экраны на .NET — добавляются по очереди

Рис. 1: Три схемы поэтапной миграции — где проходит граница между старым и новым.

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

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

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

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

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

Минимальная реализация моста — несколько строк. Сначала направление компонент .NET вызывается из VB6. На публикуемые интерфейс и класс вешают атрибуты.8

// Сторона .NET (C# / .NET 8) — публикация как COM, чтобы вызвать из VB6
using System.Runtime.InteropServices;

[ComVisible(true)]
[Guid("fe103d6e-e71b-414c-80bf-982f18f6c1c7")]   // IID интерфейса. Всегда генерируйте новый сами
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITaxCalculator
{
    decimal CalcTax(decimal amount);
}

[ComVisible(true)]
[Guid("9f35b6f5-2c05-4e7f-93aa-ee087f6e7ab6")]   // CLSID класса. Его тоже генерируйте заново
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Komura.TaxCalculator")]
public class TaxCalculator : ITaxCalculator
{
    public decimal CalcTax(decimal amount) => Math.Floor(amount * 0.1m);
}

В csproj включают генерацию COM-хоста, собирают и регистрируют получившийся .comhost.dll из командной строки с правами администратора.8

<PropertyGroup>
  <EnableComHosting>true</EnableComHosting>
</PropertyGroup>
regsvr32 TaxLib.comhost.dll

Вызывающая сторона на VB6 — как с любым COM-объектом.

' Сторона VB6 — поздняя привязка по ProgId
Dim calc As Object
Set calc = CreateObject("Komura.TaxCalculator")
MsgBox calc.CalcTax(12345)
Set calc = Nothing

Здесь два места, на которых спотыкаются всегда. Оба описаны в официальной документации.8

  • По умолчанию компонент доступен только 64-битным клиентам. В отличие от эпохи .NET Framework, в .NET Core / .NET 5+ даже сборка как «Any CPU» даёт сопутствующий *.comhost.dll по умолчанию 64-битным. VB6 — 32-битный процесс, поэтому как есть он это не загрузит (то же ограничение WOW641). Соберите так, чтобы выходила 32-битная comhost.dll.
  • Автономное (self-contained) распространение COM-компонента не поддерживается. Поддерживается только развёртывание, зависимое от платформы (framework-dependent). Способ распространения нужно решить до проектирования.

Обратное направление — код VB6 вызывается из .NET — это просто добавить ActiveX DLL как COM-ссылку.

// Сторона .NET — вызов ActiveX DLL, собранной в VB6, через COM-ссылку
// Подготовка: добавить в проект «COM-ссылку» и собрать как 32-бит (x86)
var legacy = new LegacyBiz.OrderCalc();      // класс, написанный на VB6
decimal total = legacy.CalcTotal(orderId);   // бизнес-логика остаётся на стороне VB6
Marshal.ReleaseComObject(legacy);            // COM-объект освобождают явно

И здесь вызывающую сторону .NET нужно собрать как 32-бит (x86). ActiveX DLL из VB6 — 32-битная DLL, а 64-битный процесс не может загрузить 32-битную DLL для выполнения.1 Требование «хотим и новую 64-битную функцию, и вызов логики VB6» в одном процессе на этом месте уже не сходится. Тогда очередь раздела 7.3.

7.3 Разнести по процессам и связать их

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

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

8. Целевой язык — C# или VB.NET

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

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

С точки зрения миграции это читается так.

  • Если выбрать 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 году, официальной опоры для того, чтобы пересобрать или починить код, уже нет — положение асимметричное.43
  • Настоящий срок задаёт не ОС, а есть ли ещё среда и люди, которые могут чинить. План миграции составляют не после сбоя, а пока старую систему ещё можно использовать как «работающую спецификацию».
  • Три пути: переписывание с нуля, автопреобразование, поэтапная миграция. До выбора схемы — инвентаризация экранов, внешних связей, OCX, объявлений API и бизнес-правил, которые живут только в коде.
  • Если бизнес нельзя останавливать, старое и новое сосуществуют через опережающий слой данных, взаимодействие с COM или разделение процессов, и границу собирают в одном месте.
  • Для нового кода рекомендуется C#. Стабильный курс VB.NET — официальная политика5; как основа долгосрочного сопровождения выгоднее C#.

9.1 Следующий шаг — что сделать в первую неделю

Чек-лист такого размера, чтобы «рассмотреть миграцию» не зависло в воздухе. Кода не пишут ни строки.

  • Найти полный исходный код. Сверить с актуальным исполняемым файлом в продакшене и убедиться, что это действительно текущая версия (как в главе 3: если здесь расхождение, всё дальнейшее уходит впустую)
  • Проверить машины, на которых ещё запускается IDE VB6. Сколько их, какая ОС, можно ли заново собрать стенд, если сломается
  • Выгрузить ссылки из .vbp. Прогнать скрипт из главы 5 и получить CSV
  • К каждой строке списка добавить три колонки: «можно ли достать / есть ли поддержка поставщика / есть ли замена на .NET» — и заполнить. Пустые ячейки — это как раз трудные места миграции
  • Посчитать экраны и отчёты. Затем на месте спросить, какими экранами реально пользуются. Уже одно только «не переносить неиспользуемые» сильно меняет оценку
  • По всему дереву исходников извлечь операторы Declare. Разобрать по назначению и отделить то, что закрывается стандартными средствами .NET
  • Решить, с чем сверять. Чем подтверждать корректность после миграции (отчёт, CSV, содержимое БД) — выбрать один эталон
  • Выяснить, есть ли уже требования, которые упираются в 32 бита. Если есть, этот один пункт становится главным условием выбора схемы

На этом материале уже можно идти к выбору схемы в главе 4 и к пилоту в главе 5.

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

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

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

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

  1. Microsoft Learn, Running 32-bit Applications. О том, что WOW64 — x86-эмулятор, который запускает 32-битные приложения на 64-битной Windows и входит в состав ОС; что система разделяет 32-битные и 64-битные приложения, чтобы не сталкивать файлы и реестр; что взаимодействие через границу 32/64, в том числе COM, предоставляется; но 32-битный процесс не может загрузить 64-битную DLL для выполнения, и 64-битный процесс не может загрузить 32-битную DLL. ↩ ↩2 ↩3

  2. Microsoft Learn, Strangler Fig pattern (Azure Architecture Center). О паттерне поэтапной миграции, в котором функции унаследованной системы понемногу заменяют новым приложением или сервисами; между клиентом и системой ставят фасад (прокси) и направляют запросы в старое или новое; по мере миграции направление сдвигают на новую систему и в итоге останавливают старую и убирают фасад. ↩

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

  4. 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

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

  6. Microsoft Learn, Visual Basic 6.0 partner offers. О том, что как бесплатные и платные партнёрские инструменты для более полного перехода с Visual Basic 6.0 на Visual Basic .NET названы Visual Basic Upgrade Companion (VBUC) от Mobilize.Net, Great Migrations Studio (gmStudio) и VB Migration Partner. ↩

  7. Microsoft Learn, Project File (.vbp) Format. О том, что Visual Basic всегда сохраняет файл проекта (.vbp) в ASCII; что формы, модули, ссылки и параметры компиляции записываются построчно; и о примере строки Reference= (GUID, версия, локаль, путь к файлу и описание идут через #). ↩

  8. Microsoft Learn, Exposing .NET Core components to COM. О том, что на интерфейс и класс вешают [ComVisible(true)] и [Guid] (в отличие от .NET Framework, CLSID класса, который активирует COM, задавать обязательно); что при <EnableComHosting>true</EnableComHosting> в csproj выходит имя_проекта.comhost.dll, который регистрируют через regsvr32; что в .NET Core / .NET 5+ автоматическая генерация TLB из сборки не поддерживается — пишут IDL или берут сообщественный dscom; что по умолчанию даже при «Any CPU» сопутствующий *.comhost.dll 64-битный и доступен только 64-битным клиентам; и что автономное (self-contained) распространение COM-компонента не поддерживается, только зависимое от платформы. ↩ ↩2 ↩3

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

Как безопасно менять унаследованное бизнес-приложение без тестов — характеризационные тесты и рефакторинг на практике

На примерах C# разбираем, как безопасно менять бизнес-приложение без тестов: как зафиксировать текущее поведение характеризационным тесто...

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

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

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

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

Будут ли приложения VB6 работать в Windows 11?
Да, они входят в число поддерживаемых. По политике поддержки Microsoft среда выполнения VB6 (msvbvm60.dll и связанные файлы) поддерживается, пока поддерживается версия Windows, в состав которой она входит. В список входят Windows 11, Windows 10, Windows Server 2025 и другие. Объём поддержки узкий: только серьёзные регрессии в уже существующих приложениях и критические проблемы безопасности. Кроме того, среда выполнения VB6 только 32-битная; в 64-битной Windows она поддерживается лишь внутри 32-битной среды совместимости 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, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

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

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