Лучшие инструменты разработки для обновления с VB6.0 - PullRequest
5 голосов
/ 12 марта 2009

Я планирую обновить большое приложение vb6 до .net. В проекте используется множество сторонних компонентов, например VSFlexGrid, а также отчеты Crystal. Он также использует старые библиотеки VB6, исходный код которых недоступен. Мои вопросы

  1. Должен ли я преобразовать источник в C # или VB.net достаточно надежен? Что мне делать со сторонними компонентами, которые не поддерживаются или используют небезопасные / устаревшие технологии?

Я бы приветствовал любой полезный вклад от любого, кто делал это раньше.

Ответы [ 7 ]

7 голосов
/ 12 марта 2009

Вот адаптация пары моих ответов на подобные вопросы.

Преобразование автоматически - лучший выбор, чем перезапись. Это распространенная ловушка - начинать оптимистично переписывать большие части программного обеспечения, добиваться хороших результатов на раннем этапе, исправляя некоторые известные недостатки старой архитектуры, а затем увязнуть в функциональности, которую вы только что воспринимали как должное в течение многих лет. , В этот момент ваше руководство начинает нервничать, и все может стать очень неудобным.

... и вот сообщение в блоге от Microsofty, которое соглашается со мной :

Многие компании, с которыми я работал в первые годы существования .NET, сначала смотрели на переписывание, отчасти вызванное сильным желанием улучшить базовую архитектуру и структуры кода одновременно с переходом на .NET. К сожалению, многие из этих проектов столкнулись с трудностями, а некоторые так и не были завершены. Проблема, которую они пытались решить, была слишком большой

Эта превосходная страница Microsoft рекомендует использовать два сторонних инструмента миграции, которые превосходят встроенный мастер обновления VB.NET (больше не доступен ) - Artinsoft и CodeArchitects VBMigration . Я полагаю, что у них есть некоторая поддержка общих сторонних элементов управления и библиотек DLL - Artinsoft suport these . Стоит связаться с ними со списком ваших зависимостей. В VBMigration есть бесплатный инструмент , который перечисляет зависимости именно по этой причине. Также стоит связаться с оригинальными поставщиками в надежде на эквивалент .NET.

На странице Microsoft также написано:

Выполнение полной перезаписи на .NET гораздо более затратно и трудно сделать хорошо [чем преобразование] ... мы рекомендуем этот подход только для небольшого числа ситуаций.

В Stack Overflow гораздо больше разработчиков на C #, чем на VB.NET, поэтому вы, вероятно, получите несколько ответов, рекомендующих C #. Также исторически Microsoft имела тенденцию поддерживать C # с энтузиазмом в плане примеров кода для новых частей .NET и так далее. Но теперь Microsoft заверяет нас в том, что:

Оба [C # и VB.NET] являются первоклассными языками программирования, основанными на Microsoft .NET Framework, и они одинаково мощны.

Так что это личное решение, хотите ли вы выбрать C # или VB.NET. Инструмент Artinsoft утверждает, что он может конвертировать VB6 в C #.


РЕДАКТИРОВАТЬ: я только что нашел другое предложение - NewCode - через объявление на сайте программирования!

Мое мнение состоит в том, что веб-сайт не такой подробный, как два конкурента, о которых я писал выше. Это может быть несправедливо. Кто-то из Microsoft Ireland написал в блоге о них - я думаю, что они живут в Ирландии. Очевидно, инструмент преобразует ваш VB6 в DSL, а затем в VB.NET Winforms, C #, WPF, Java ...

3 голосов
/ 12 марта 2009

Обновление; даже если существуют механические инструменты, это мало что даст для вас. Это не сделает его волшебным образом подходящим для .NET, и не сделает приличное использование фреймворка. Я всегда предпочел бы переписать в этом сценарии, но это связано с рисками / издержками. Например, некоторые мои коллеги в настоящее время переписывают некоторый код VB6 / ASP / COM + / xslt для использования ASP.NET MVC - большая часть «интересного» кода на самом деле является бизнес-логикой, которую не так сложно портировать ( трюк проверяет это ;-p). Помогает то, что компоновка нашего кода VB6 является гранулированной, что позволяет нам переносить отдельные фрагменты, не нажимая всю партию сразу.

Сторонние элементы управления будут неприятностью, и, похоже, что другие библиотеки могут быть перепроектированы. Не тривиально.

Выбор между C # и VB.NET во многом вторичен. Оба имеют некоторые незначительные преимущества, но в целом вы можете сделать большинство вещей с любым из них. Если вам нужно COM-взаимодействие, тогда VB.NET может быть полезен (либо для всего, либо только для конкретной сборки) - но C # 4.0 (в VS2010) восполнит этот пробел с помощью новой dynamic типизации и изменений без PIA , В целом, я в значительной степени предпочитаю C #, но это должно быть локальное решение.

2 голосов

Я бы предложил вам «частично переписать» ваше приложение. Причудливое название этого подхода - удушение (http://martinfowler.com/bliki/StranglerApplication.html).

Я предполагаю, что это приложение базы данных. Посмотрите, сможете ли вы переписать некоторые функции, напрямую поговорив с БД. Не беспокойтесь о том, чтобы пользователи использовали два приложения. Старое приложение достаточно плохое, чтобы они могли запросить обновление.

Мое другое предположение состоит в том, что, поскольку это VB6, у него не очень хорошее разделение UI / BusinessLogic. Вот почему автоматическое обновление не принесет вам слишком много.

Может быть, я ошибался в вашей ситуации. Вы должны спросить вас, сколько вы действительно можете извлечь из существующего кода. Купите / Прочитайте книгу кодов Наследия Майкла Пера тоже.

2 голосов
/ 12 марта 2009

Я говорю об этой проблеме здесь

Первый и самый важный шаг - сделать ваше существующее приложение максимально доступным .NET. Все, что специфично для VB6 или зависит от стороннего элемента управления, получает как можно больше от интерфейсов. Интерфейс точно покажет, для чего вы используете сторонние продукты и какое поведение в первую очередь. Делая это сначала в VB6, вы можете запустить модульные и интеграционные тесты, чтобы убедиться, что поведение СОХРАНЕНО. Это ключевой элемент, что поведение вашего приложения сохраняется.

Что касается проблемы между C # и VB.NET. Функционально мало различий между двумя языками. Один из моих проектов по конверсии в 90-х годах заключался в переносе приложения CAD / CAM моей компании с диалекта BASIC, известного как Rocky Mountain BASIC, на Visual Basic 3. До этого у нас было несколько фальстартов, и нам было позже доказано, что это гораздо проще сохранить поведение, переключившись на другой язык семейства BASIC, чем конвертировать в совершенно другое семейство языков, такое как C.

Поймите, что в наших обстоятельствах у нас много сложных математических подпрограмм, и математика является одной из немногих областей, в которых теория относительности остается неизменной в семействе языков BASIC. Так что мой опыт не может быть на 100% применим к вашему делу.

По моему мнению, лаконичность языков стилей Си отрицательно сказывается на долговременной поддержке (десятилетия). Однако, чтобы быть справедливым, это в лучшем случае второстепенный момент. Я имею большой опыт работы с обоими языками, поскольку я пишу и поддерживаю моделирование Mercury и Gemini Space Capsule, написанной на C ++, с некоторыми утилитами, написанными на C # в дополнение к программе CAD / CAM на VB6 / VB.NET для моей компании.

В настоящее время наше преобразование .NET сфокусировано на VB.NET. Я обнаружил, что автоматизированные инструменты почти бесполезны, так как мы - мощная графически ориентированная программа. К счастью, мы не используем вызовы VB Graphics напрямую, а помещаем все за интерфейс Canvas. Для совместимости печати мы используем Библиотеку совместимости принтеров от VB Power Pack в качестве отправной точки.

У нас есть инструмент, через который мы выполняем наш код, который преобразует все целые числа в тип Int16 и все длинные в тип Int32, а также несколько других обычно выполняемых преобразований. Затем мы помещаем преобразованный класс или подпрограмму в нашу библиотеку .NET и запускаем модульные тесты. Результаты сравниваются с теми же тестами, которые проводились с исходным кодом VB6.

Самая большая боль в заднице - это формы. Простой диалог - это нормально, но для более сложных форм нам просто нужно переопределить. Опять же, наши формы лежат за интерфейсами в нашем исходном коде, поэтому пока мы работаем, нам просто понять, что делать.

1 голос
/ 12 марта 2009

Я начал переделывать одно из приложений моей компании, написанных на VB6, для VB.NET. И C #, и VB.NET полагаются на .NET Framework, и различия между приложением, скомпилированным в любом из них, незначительны. Выберите язык, с которым вам и другим людям, работающим над проектом, будет удобнее. Одним из преимуществ использования VB.NET (хотя я не решаюсь так его называть) является то, что вы можете использовать функцию «Обновить код Visual Basic 6» в Visual Studio. Есть некоторые вещи, которые исправляет конвертер, а многие нет. Если вы хотите попробовать это, вам придется очистить код VB6:

  • Все массивы должны быть на основе нуля
  • Избегайте использования строк фиксированной длины, если это вообще возможно. Этот код необходимо изменить, чтобы использовать массивы Char в vb.net
  • Явно объявляем все переменные. Используйте Option Explicit, если вы еще не
  • Избегайте вариантов, таких как чума, если только вы абсолютно не должны использовать один для вызова API
  • Укажите ByRef или ByVal при передаче параметров, не полагайтесь на поведение по умолчанию для этого
  • Всегда указывайте, какое свойство вы меняете, свойства по умолчанию не существуют в vb.net. Например, «txtName = strName» становится «txtName.Text = strName»
  • Более подробный список этих различий можно найти здесь

Даже после максимально возможной очистки существующего кода конверсия все еще не составляет 100%. Вы можете попробовать это в отдельном проекте, просто чтобы увидеть, что вы получите, чтобы дать вам идеи о том, как вещи должны быть переработаны. Иногда формы выглядят некрасиво и после преобразования, и в некоторых случаях вы можете в конечном итоге переделать их с нуля.

Многие наши формы активно использовали свойство ItemData в полях со списком и списках, которых больше нет в .NET. ListViews также работают по-разному, и ни одна из функций рисования не совпадает. Некоторые формы из приложения, которое я конвертировал, выглядели очень плохо при преобразовании в элементы управления .NET и не вели себя одинаково, так что я собираюсь закончить их переработку с нуля. Преимущество в том, что я могу переделывать процессы, которые с самого начала были не очень эффективными, но, конечно, это занимает гораздо больше времени. Соедините это с тем фактом, что я все еще учусь изучению того, что делают различные библиотеки .NET ... да, это займет некоторое время.

0 голосов
/ 09 января 2018

Вопрос явно касается информации о «Лучших инструментах разработки для обновления с VB6.0» для большого и сложного обновления VB6 / COM, а затем о C # или VB.NET.

Идеальный инструмент «конверсии» поможет вам достичь двух важнейших целей каждого обновления

  1. Сохранение функциональности
  2. Использование .NET таким образом, который соответствует вашим желаемым стандартам кодирования и зависимости от платформы

Роль инструмента в сохранении функциональности

Большие, зрелые устаревшие системы могут содержать тысячи файлов кода и миллионы строк кода. Усилия, необходимые для полного описания и проверки функциональности, воплощенной в таком большом количестве кода, огромны. На самом деле, может быть так много функциональной работы, что некоторые команды с техническими взглядами сначала не видят ее. Они проводят большую часть своего времени, беспокоясь о том, как воспользоваться преимуществами новейших функций дизайна, языка и инфраструктуры .NET, прежде чем полностью осознают, насколько трудно будет сохранить и проверить устаревшие функциональные возможности. Как будто они ловят рыбу сзади огромного функционального кита, беспокоясь о ловле маленькой технической рыбы.

Команды, которые пытаются воспроизвести множество кода, читая, интерпретируя и перекодируя его вручную, вполне могут ослепнуть в этом процессе ... Поэтому критическая особенность любого инструмента преобразования состоит в том, чтобы помочь команде читать, интерпретировать и переписывать свой код переписывая его в форме, которая сохраняет его семантику. Более 60 лет ученые-компьютерщики изучали проблему чтения и интерпретации исходного кода, и решение, которое они нашли, называется компилятором. Эффективный «конвертер» кода работает как компилятор.

VB6 - это язык высокого уровня: компилятор Microsoft VB6 и его среда выполнения неисчислимым образом делали множество вещей: управление выводом типов, неявные преобразования, неявные с помощью ref, вызовы с поздним связыванием, работа с нулями, обработка ошибок в стиле goto, разработка форм и т. д. Конвертер VB6 также должен уметь распознавать и хранить множество мелких деталей, которые явно не указаны в коде, и должен уметь правильно выражать эти детали в .NET. Промышленный инструмент преобразования прочности будет иметь мощную, расширяемую метаязычную систему VB6, которая позволяет пользователю контролировать, как код VB6 распознается и интерпретируется.

VB6 также легко расширяется через COM. Существует много сотен различных API-интерфейсов COM, и это не считая всех внутренних компонентов, которые обычно становятся частью корпоративных систем. Преобразователь должен иметь возможность распознавать любой класс COM или элемент управления, используемый VB6, как в дизайне пользовательского интерфейса, так и в коде, и выражать его с помощью какого-либо другого соответствующего .NET API или взаимодействия. Один инструмент, о котором я знаю, может даже генерировать структуру кода .NET из информации об использовании COM в VB6. Промышленный инструмент преобразования прочности будет иметь мощную систему типов COM, которая является расширяемой и позволяет пользователю контролировать, как COM заменяется в сгенерированном коде.

Роль инструмента в использовании .NET

VB6 и .NET во многом различны, как и различные API, поддерживающие две платформы. Таким образом, с инструментами или без них почти всегда потребуется некоторая переделка. Кроме того, каждая команда привносит разные предпочтения, ограничения и требования в свой проект: спросите 10 программ, как что-то кодировать, и вы получите по крайней мере 10 разных ответов. Конвертер должен помочь команде выразить свои уникальные предпочтения, ограничения и требования. Это включает в себя обеспечение повторяющихся, самодокументируемых средств изменения кода VB6 перед его обработкой, изменения кода .NET после его создания, интеграции рукописного кода, описания пользовательских замен API, направления реструктуризации пользовательского кода и выполнения множества других динамических и проектных операций -специфические преобразования по мере необходимости.

Собираем все вместе

Большое обновлениередко бывает полностью предсказанным и спланированным заранее. Даже имея обширные знания как исходного кода, так и желаемых стандартов кодирования .NET, в ходе работы будет много проблем и возможностей. Исходный код и требования должны быть изменены во время проекта обновления. Необходима гибкая методология, которая позволяет Наша команда должна адаптироваться к изменениям исходного кода, экспериментировать с различными методами кодирования .NET, реагировать на более глубокое понимание требований и постепенно улучшать процесс их автоматического обновления с течением времени. Промышленный инструмент преобразования прочности будет обладать точностью, точностью, гибкостью и скоростью, позволяющими использовать этот тип методологии.

Еще один комментарий об инструментах конвертации. Самый важный «инструмент», который вы будете использовать при обновлении .NET, - это ваш мозг. Вы должны изучать языки .NET, шаблоны проектирования и платформы и применять то, что вы знаете, при обновлении. Лучший автоматизированный инструмент не решает за вас, как переписать ваш код: он помогает вам повторно реализовать устаревшие функциональные возможности в соответствии с дизайном, который вы считаете целесообразным.

Microsoft предлагает несколько инструментов в этой статье. VB6 Upgrade Partner Tools

VB.NET или C #

Когда я спрашиваю сообщество .NET (т. Е. Выполняю поиск в Интернете) информацию, инструменты, идеи, код и помогаю с проблемами программирования, у меня гораздо больше шансов найти ответы, выраженные в C #, чем в VB.NET. Я также считаю, что компилятор C # лучше подходит для переписывания с помощью инструментов, поскольку он требует, чтобы сгенерированный код был более внутренне согласованным и явно описанным. Получение и сохранение сборки - это довольно грубая, но абсолютно критическая проверка качества кода и ключевая веха в любом процессе обновления. Помните, что VB.NET не VB6. Это кажется очевидным, но это может быть трудно иметь в виду, потому что два языка выглядят одинаково. Это сходство может быть обманчивым; так что IMO лучше перейти на C #, где вам напоминают, что правила разные. Наконец, C # всегда был и остается разработанным для .NET; VB.NET не может этого сказать.

Отказ от ответственности: я работаю на Великих Миграций. Есть еще много вопросов для обсуждения. Пожалуйста, посетите Портал документации Great Migrations , чтобы узнать больше статей, получить пробную версию gmStudio и попробовать инструмент для повышения промышленной прочности для себя.

0 голосов
/ 12 марта 2009

Вам не понравится мой ответ, но здесь идет.

а) Наймите кого-то, обладающего значительным опытом в создании больших приложений .Net, чтобы прийти и направить проект и научить вас.

b) Извлеките бизнес-требования из вашего текущего приложения и заморозьте их.

в) Отпразднуйте тот факт, что это должен быть самый простой проект по разработке новых приложений, потому что у вас есть кто-то с опытом работы с технологиями, у вас есть зрелые инструменты для создания приложения и четко определенный набор требований, так что вы точно знаете, что строить.

P.S. На данный момент я бы не стал беспокоиться о Winforms. Я бы прыгнул прямо в WPF, ты поблагодаришь меня позже.

P.P.S Язык действительно не имеет значения (C # или VB.Net). Усилие будет таким же.

...