Скотт Свигарт (Scott Swigart), Компания Swigart Consulting LLC
Обзор
У многих организаций накоплено значительное количество кода на Microsoft Visual Basic 6, и они ищут наилучшее решение в отношении этого старого кода. Есть три существенно различных варианта решения, как поступить с приложениями Visual Basic 6. Можно поддерживать приложение Visual Basic 6 как есть, не встраивая никаких новых технологий в старое приложение. Можно полностью перенести приложение Visual Basic 6 на Visual Basic .NET. Или же можно сохранить код Visual Basic 6 и наладить взаимодействие с Visual Basic .NET, чтобы с легкостью добавить любую функциональность .NET Framework в существующее приложение. В этой статье обсуждаются рекомендации для последнего варианта, известного как слияние Visual Basic.
Устройство среды выполнения Visual Basic 6 и Visual Basic .NET
Приложения Visual Basic 6 по сути являются приложениями COM. Когда в Visual Basic 6 нужно выполнить конкретную операцию, такую как обращение к базе данных или построение интерфейса, можно добавить ссылку на подходящий компонент COM и использовать его функциональные возможности. Другие приложения обычно также предоставляют функциональность при помощи компонентов COM. Например, приложение Visual Basic 6 способно автоматизировать Microsoft Word или Excel, потому что они предоставляют интерфейсы COM.
Приложения Visual Basic .NET не основаны на COM и по умолчанию не предоставляют интерфейсов COM. Приложения Visual Basic .NET используют возможности библиотек классов .NET. Среда Майкрософт .NET Framework включает тысячи библиотек классов, позволяющих приложениям Visual Basic .NET взаимодействовать с базами данных, получать доступ к Интернету, обращаться к системному реестру, файловой системе, журналу событий, системным данным и т. д.. Число возможностей, доступных при использовании библиотек классов .NET Framework (FCL), значительно превышает возможности Visual Basic 6.
Visual Basic 6 и Visual Basic .NET основаны на несовместимых технологиях. Приложение Visual Basic 6 может получить доступ к библиотекам классов .NET, но для этого ему необходимо воспользоваться уровнем взаимодействия, известным как обертка, вызываемым клиентом. Она оборачивает необходимый класс .NET и представляет его в виде традиционного объекта COM, который можно использовать в любом окружении, где могут применяться объекты COM (Visual Basic 6, Visual Basic 5, ASP, VBA, VBScript и т. д.).
Обращение к .NET Framework
Как продемонстрировано в статье «Использование библиотеки классов .NET Framework в Visual Basic 6» (EN), первым шагом при обращении к .NET Framework является регистрация необходимой библиотеки .NET Framework (сборки) как объекта COM. Это можно сделать при помощи средства командной строки regasm, включенного в пакет .NET Framework SDK, которое устанавливается в составе продукта Visual Basic Express (EN). Если у вас не установлен пакет Visual Studio 2005, настоятельно рекомендуется загрузить и установить Visual Basic Express,
Пошаговая инструкция 1. Регистрация сборки System.dll для использования ее в Visual Basic 6
Нажмите кнопку Пуск и выберите команду Выполнить.
В диалоговом окне Выполнить введите CMD и нажмите кнопку OK.
Введите cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727.
Введите regasm system.dll.
После того, как сборка зарегистрирована, можно ссылаться на нее в Visual Basic 6, как и на любой другой объект COM:
Рис. 1. Добавление ссылки на system.dll в Visual Basic 6
Еще раз, Visual Basic 6 будет в состоянии обращаться к сборке .NET System.dll, потому что для нее была создана вызываемая обертка COM. Однако класс .NET должен подчиняться набору достаточно ограничительных правил, чтобы он и его методы работали в вызываемой обертке COM. В результате, лишь очень маленький процент классов из сборки System.dll можно будет вызывать напрямую в Visual Basic 6. Один из методов, который можно вызвать в Visual Basic 6 - это WebClient.DownloadFile.
Dim webDownload As System.WebClient
Set webDownload = New System.WebClient
webDownload.downloadFile _
"http://www.ssec.wisc.edu/data/west/latest_westir.jpg", _
App.Path & "\latest_westir.jpg"
Создание оберток с помощью Visual Basic .NET
Приведенный пример не должен создавать ложного впечатления, что достаточно использовать regasm для любой сборки .NET, чтобы сделать возможности .NET доступными в Visual Basic 6. Практически в каждом случае, когда необходимо обратиться к .NET Framework, компонентам .NET сторонних разработчиков или библиотекам .NET, лицензированным с открытым исходным кодом, придется разрабатывать классы оберток Visual Basic .NET. Это необходимо, потому что для правильного представления в качестве объекта COM класс .NET должен подчиняться достаточно строгим правилам, а большинство классов .NET им не следуют.
Для доступа к возможностям .NET создается класс Visual Basic .NET, соответствующий правилам взаимодействия с COM, который обращается к требуемому коду .NET от имени приложения Visual Basic 6.
Рис. 2. Обращение к .NET Framework в Visual Basic 6 с использованием классов оберток Visual Basic .NET
Простой класс обертки
В качестве простого примера рассмотрим класс Guid .NET Framework. GUID - это глобально уникальный идентификатор. Идентификаторы GUID используются во многих местах в Windows для уникальной идентификации объектов COM, файлов, пользователей и в принципе чего угодно. Они выглядят как строки вида: 13427d57-ccb5-42fd-91f7-b49d4c2ae9a3. Самое замечательное в GUID то, что при правильном его создании можно быть абсолютно уверенным, что никто другой никогда не создаст такого же.
В Visual Basic 6 нет простого способа создать GUID, хотя в Visual Basic .NET это делается всего одной строкой кода:
Dim g as Guid = Guid.NewGuid()
К сожалению, класс Guid не был создан таким образом, чтобы его можно было вызвать напрямую в Visual Basic 6. Чтобы использовать эту функциональность в Visual Basic 6, вам нужно создать очень простой класс обертки Visual Basic .NET. Этот класс обертки Visual Basic .NET будет представляться как объект COM для использования в Visual Basic 6 и совершать необходимый вызов класса Guid .NET Framework.
Пошаговая инструкция 2. Создание обертки Visual Basic .NET для класса Guid
Загрузите и извлеките код примеров к этой статье.
Скопируйте файл ComClass.zip в папку Мои документы\Visual Studio 2005\Templates\ItemTemplates\Visual Basic.
Если используется Visual Studio 2005, можно пропустить шаг 2. Однако в Visual Basic Express не включен шаблон класса COM по умолчанию, а этот шаблон очень полезен для представления .NET Framework через объекты COM. Если скопировать файл ComClass.zip в указанную папку, то шаблон класса COM будет доступен для Visual Basic Express.
В Visual Basic Express выберите в меню Файл команду Новый проект.
Выберите значение Библиотека классов в поле Шаблон.
Введите NetFxWrapper в качестве имени. Эта строка станет именем компонента и появится в списке ссылок, доступных в Visual Basic 6.
Рис. 3. Создание проекта обертки в Visual Basic .NET
Нажмите кнопку ОК.
В окне обозревателя решений удалите Class1.
В меню Проект выберите команду Добавить новый элемент.
В диалоговом окне Добавление нового элемента:
Выберите COM Class в качестве шаблона.
Введите GuidWrapper в поле Имя.
Нажмите кнопку Добавить.
В строке 20 (после End Sub и перед End Class) введите следующее:
Public Function NewGuid() As String
Dim g As Guid = Guid.NewGuid()
Return g.ToString()
End function
В результате будет создан экземпляр класса Guid и присвоен переменной типа Guid. Затем значение Guid преобразуется в строку и возвращается.
Выберите команду Сборка NetFxWrapper меню Сборка. Компонент скомпилируется и будет зарегистрирован как объект COM.
Теперь, когда обертка создана, вы можете обращаться к ней в Visual Basic 6.
Пошаговая инструкция 3. Использование обертки в Visual Basic 6
Запустите Microsoft Visual Basic 6.0.
В диалоговом окне New Project выберите Standard Exe и нажмите кнопку Open.
Выберите команду References меню Project.
Добавьте ссылку на NetFxWrapper.
Рис. 5. Добавление ссылки на объект COM, созданный в Visual Basic .NET
Добавьте в форму кнопку CommandButton и текстовое поле TextBox.
Установите свойство Caption кнопки CommandButton в значение Создать.
Для обработки события о щелчке кнопки CommandButton введите:
Private Sub Command1_Click()
Dim gw As NetFxWrapper.GuidWrapper
Set gw = New NetFxWrapper.GuidWrapper
Text1.Text = gw.NewGuid
End Sub
Запустите приложение. Каждый раз при нажатии кнопки приложение Visual Basic 6 будет обращаться к оберткеVisual Basic .NET и создавать новый GUID. Этот GUID будет отображаться в текстовом поле TextBox.
Рис. 6. Отображение GUID
Правила создания оберток
Класс обертки необходим, потому что класс Guid не следует правилам взаимодействия с COM. Эти правила, которым должен следовать ваш класс обертки, таковы:
Обертка должна объявлять конструктор по умолчанию
В Visual Basic 6 сперва создается экземпляр объекта, а затем используются свойства и методы для его инициализации. Например:
Инициализация объекта подключения к источнику данных в Visual Basic 6
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb;" & _
"User Id=admin;Password=;"
Для создания объекта подключения нужно сперва создать его, а затем указать его свойства, такие как ConnectionString. В Visual Basic 6 создание объекта и инициализация его свойств должны быть сделаны отдельно.
Однако в Visual Basic .NET можно указать данные для инициализации во время создания объекта. Аналогичный код в Visual Basic .NET был бы:
Передача аргументов конструктору в Visual Basic ..NET
Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=mydb.mdb;User Id=admin;Password=;")
Вы видите, что объект создается и инициализируется одной строкой кода. Это возможно потому, что у типов .NET есть метод New, вызываемый при создании объекта, и он может принимать параметры. У класса может даже быть несколько вариантов конструктора New, каждый из которых принимает разное число и типы аргументов.
Конструкторы класса в Visual Basic .NET
Public Sub New()
End Sub
Public Sub New(ByVal connectionString As String)
End Sub
При создании экземпляра класса компилятор Visual Basic .NET автоматически решает, какой из методов New вызывать. Если создается экземпляр OleDbConnection без каких-либо параметров, компилятор вызовет метод New, не принимающий никаких аргументов. Если создается экземпляр OleDbConnection с параметром строки подключения, компилятор автоматически создает вызов метода New, который принимает в качестве аргумента строку.
Метод New, не принимающий никаких аргументов, называется «конструктором по умолчанию», что означает, что он вызывается по умолчанию, когда не передается никаких аргументов.
Поскольку в Visual Basic 6 невозможна передача аргументов в момент создания объекта, класс .NET должен предоставлять конструктор по умолчанию , или его нельзя будет использовать напрямую в Visual Basic 6. Одной из причин, по которой многие классы .NET Framework нельзя использовать напрямую, в том, что все их методы New требуют аргументов. Они не объявляют конструктора по умолчанию, и у вас нет возможности создавать их экземпляры в Visual Basic 6.
Для таких объектов можно создавать классы обертки. У такой обертки есть конструктор по умолчанию, а при создании экземпляра требуемого класса .NET Framework она передает необходимые параметры методу New этого класса.
В качестве конкретного примера рассмотрим класс FileInfo .NET Framework. Этот класс предоставляет доступ ко многим атрибутам файла на диске. Однако, у него нет конструктора по умолчанию. Методу New класса FileInfo необходим путь к интересующему нас файлу, но это можно обернуть следующим способом:
Обертка для класса FileInfo Visual Basic .NET
Private fi As FileInfo
Public Sub New()
End Sub
Public Sub Initialize(ByVal filePath As String)
fi = New FileInfo(filePath)
End Sub
Эта обертка содержит подпрограмму-метод New, не принимающий аргументов. Это позволит зарегистрировать этот класс для взаимодействия с COM, так что приложение Visual Basic 6 сможет создать его экземпляр. Оборачиваемый класс FileInfo не создается, пока приложение Visual Basic 6 не вызывает метод Initialize. Использование в Visual Basic 6 будет таким:
ание обертки для FileInfo в Visual Basic 6
Dim fi As NetFxWrapper.FileInfoWrapper
Set fi = New NetFxWrapper.FileInfoWrapper
fi.Initialize ("c:\somefile.txt")
Многие типы данных нуждаются в преобразовании при совместном использовании Visual Basic 6 и Visual Basic .NET
Большая часть работы при создании обертки сводится к преобразованию типов данных Visual Basic .NET к чему-то, с чем в состоянии работать Visual Basic 6. Рассмотрим следующие два метода; один возвращает строку, а другой тип данных Guid:
Метод обертки в Visual Basic .NET
Public Function NewGuidAsString() As String
Dim g As Guid = Guid.NewGuid()
Return g.ToString()
End Function
Public Function NewGuidAsGuid () As Guid
Dim g As Guid = Guid.NewGuid()
Return g
End Function
Вызов NewGuidAsString в Visual Basic 6 сработает просто отлично, поскольку строки легко передаются между Visual Basic 6 и Visual Basic .NET. Однако обращение к NewGuidAsGuid в Visual Basic 6 вызовет следующую ошбку:
Рис. 7. Ошибка, вызванная обращением к NewGuidAsGuid в Visual Basic 6
Это происходит из-за того, что объекты типа Guid не могут быть переданы напрямую в Visual Basic 6 из Visual Basic .NET. При создании оберток для классов NET большая часть времени будет потрачена на преобразование типов данных .NET к типам данных, используемых в Visual Basic 6.
Также можно воспользоваться атрибутом .NET MarshalAs для указания того, какие типы Visual Basic 6 должны быть использованы для аргументов и возвращаемых значений. Например, если метод Visual Basic .NET возвращает тип данных Decimal, его нельзя вызвать в Visual Basic 6. Однако, вы можете указать, что возвращаемое значение должно быть преобразовано к типу Currency. Это позволит Visual Basic 6 вызвать этот метод без ошибки.
Использование атрибута MarshalAs для преобразования типов данных Visual Basic 6 и Visual Basic .NET:
Public Function ReturnDecimal() As _
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Currency)> _
Decimal
Return 1.1
End Function
Таблица 1. Преобразования типов Visual Basic .NET и Visual Basic
Тип Visual Basic .NETТип Visual Basic 6BooleanBooleanByteByteCharНе поддерживается, возвращайте в Visual Basic 6 как строку.DateTimeDateDecimalНе поддерживается, необходимо возвращать Single или Double или воспользоваться атрибутом MarshalAs, чтобы возвратить тип Visual Basic 6 CurrencyDoubleDoubleGuidНе поддерживается, возвращайте в Visual Basic 6 как строку.IntegerLongLongНе поддерживаетсяObjectObjectSByteНе поддерживается в Visual Basic 6, возвращайте как IntegerShortIntegerSingleSingleStringStringTimeSpanНе поддерживается, используйте функции наподобие TotalSeconds или TotalMinutes и возвращайте Double.
Разделяемые функции не взаимодействуют
В Visual Basic 6 есть глобальные функции, которые можно вызвать в любом месте в коде. При этом сложно знать, какие глобальные функции логически связаны. В Visual Basic .NET можно сгруппировать связанные глобальные функции внутри класса. Преимущество при этом в том, что можно вызывать функции, используя имя класса, без необходимости создания собственно экземпляра класса:
Разделяемая функция
If Not File.Exists(someFile) Then
MessageBox.Show("File not found")
End If
В этом примере функция Exists вызывается из класса File. Для вызова этого метода в коде не создавался экземпляр класса File; вместо этого Exists вызывается прямо из типа File. Функции такого типа называются разделяемыми (или статическими) функциями, и они широко применяются в .NET Framework
Проблема с разделяемыми функциями заключается в том, что они не работают в Visual Basic 6. Чтобы можно было вызвать функцию в Visual Basic 6, она должна быть либо поистине глобальной, либо вызываться из экземпляра класса. Разделяемые функции не отвечают ни одному из условий.
Решением является создание обертки, экземпляр которой вы можете создать, а затем использовать обертку для вызова разделяемой функции.
Обертка, вызывающая разделяемую функцию
Imports System.IO
<ComClass(FileWrapper.ClassId, FileWrapper.InterfaceId, FileWrapper.EventsId)> _
Public Class FileWrapper
Public Const ClassId As String = "1596574F-9EE1-4439-854B-DF503099CEAE"
Public Const InterfaceId As String = "02F98DBC-9298-4E9D-A991-E618C1B1BC53"
Public Const EventsId As String = "2286FD23-B22D-4D49-B2CE-F3CFEC5C1CA5"
Public Sub New()
MyBase.New()
End Sub
Public Function Exists(ByVal fileName As String) As Boolean
Return File.Exists(fileName)
End Function
End Class
Класс FileWrapper может быть создан в Visual Basic 6, потому что у него есть конструктор по умолчанию. Когда вызывается метод Exists, он обращается к разделяемой функции NET File.Exists и возвращает результат. Visual Basic 6 обращается к методу экземпляра FileWrapper, а FileWrapper вызывает разделяемый метод класса File .NET Framework.
Использование в Visual Basic 6 будет таким:
Использование File.Exists в Visual Basic 6
Private Sub Command5_Click()
Dim fw As New NetFxWrapper.FileWrapper
Label2 = fw.Exists("c:\platform.ini")
End Sub
Обертки не должны использовать перегруженные функции
В .NET Framework возможно существование нескольких функций с одинаковым именем, но разными аргументами. Рассмотрим следующий пример:
Перегруженные функции в Visual Basic .NET
Public Sub Save(ByVal fileName As String)
_image.Save(fileName)
End Sub
Public Sub Save(ByVal fileName As String,
ByVal format As ImageFormatWrapper)
Dim imageFormat As Imaging.ImageFormat
Select Case format
Case ImageFormatWrapper.Bmp
imageFormat = Imaging.ImageFormat.Bmp
Case ImageFormatWrapper.Emf
imageFormat = Imaging.ImageFormat.Emf
Case ImageFormatWrapper.Exif
imageFormat = Imaging.ImageFormat.Exif
Case ImageFormatWrapper.Gif
imageFormat = Imaging.ImageFormat.Gif
Case ImageFormatWrapper.Icon
imageFormat = Imaging.ImageFormat.Icon
Case ImageFormatWrapper.MemoryBmp
imageFormat = Imaging.ImageFormat.MemoryBmp
Case ImageFormatWrapper.Png
imageFormat = Imaging.ImageFormat.Png
Case ImageFormatWrapper.Tiff
imageFormat = Imaging.ImageFormat.Tiff
Case ImageFormatWrapper.Wmf
imageFormat = Imaging.ImageFormat.Wmf
End Select
_image.Save(fileName, imageFormat)
End Sub
Одна функция принимает в качестве аргумента имя файла, а у другой есть дополнительный аргумент формата изображения. Обе функции называются Save. При вызове этих функций в Visual Basic .NET компилятор может определить, которую из них вызывать, по переданным аргументам. Если передан только один аргумент, вызывается первая. Если передано два аргумента, вызывается вторая.
COM не поддерживает перегрузку функций, поэтому, если этот класс представлен через взаимодействие с COM, обертка COM должна создавать уникальные имена для этих функций. В Visual Basic 6 они выглядят следующим образом:
Рис. 8. Вызов перегруженных функций из Visual Basic 6
Обратите внимание, что функции Save названы Save и Save_2. Это позволяет определить, которую вызывать в Visual Basic 6, но имена функций недостаточно описательны. Было бы лучше не использовать перегрузок в вашей обертке, а взамен дать каждой функции уникальное имя:
Уникальные имена функций
Public Sub Save(ByVal fileName As String)
_image.Save(fileName)
End Sub
Public Sub SaveWithImageFormat(ByVal fileName As String, _
ByVal format As ImageFormatWrapper)
Dim imageFormat As Imaging.ImageFormat
Select Case format
Case ImageFormatWrapper.Bmp
imageFormat = Imaging.ImageFormat.Bmp
Case ImageFormatWrapper.Emf
imageFormat = Imaging.ImageFormat.Emf
Case ImageFormatWrapper.Exif
imageFormat = Imaging.ImageFormat.Exif
Case ImageFormatWrapper.Gif
imageFormat = Imaging.ImageFormat.Gif
Case ImageFormatWrapper.Icon
imageFormat = Imaging.ImageFormat.Icon
Case ImageFormatWrapper.MemoryBmp
imageFormat = Imaging.ImageFormat.MemoryBmp
Case ImageFormatWrapper.Png
imageFormat = Imaging.ImageFormat.Png
Case ImageFormatWrapper.Tiff
imageFormat = Imaging.ImageFormat.Tiff
Case ImageFormatWrapper.Wmf
imageFormat = Imaging.ImageFormat.Wmf
End Select
_image.Save(fileName, imageFormat)
End Sub
Теперь у каждой функции есть уникальное имя, и ее легче использовать в Visual Basic 6.
Рис. 9. Функции с уникальными именами
Обертки следует помещать в глобальный кэш сборок
При регистрации объекта COM системный реестр содержит путь к файлу DLL этого объекта COM. Таким образом, когда приложение создает экземпляр объекта COM, операционная система может найти эту библиотеку и загрузить ее в память.
Сборки NET работают по-другому. .NET Framework рассчитывает, что сборка находится там же, где и использующее ее приложение, или в месте, которое называется глобальным кэшем сборок. Чтобы гарантировать, что ваши классы обертки .NET всегда можно найти во время выполнения, их нужно помещать в глобальный кэш сборок.
Помещение сборки в глобальный кэш требует двух шагов. Во-первых, сборка должна быть подписана. Это можно сделать так:
Вернитесь к проекту NetFxWrapper в Visual Basic Express.
В окне обозревателя решений дважды щелкните Мой проект. Откроются свойства проекта.
Откройте вкладку Подписи.
Установите флажок Подписать сборку.
В раскрывающемся списке Выберите файл ключа строгого имени щелкните <Новый...>.
В поле Имя файла ключа введите MyKeyFile.
Снимите флажок Защитить файл ключа паролем.
Нажмите кнопку ОК.
Выберите команду Сборка NetFxWrapper меню Сборка. В результате к проекту добавился файл ключа, и при каждой перекомпиляции получающаяся библиотека DLL будет подписана этим ключом. Сборки должны быть подписаны, прежде чем помещать их в глобальный кэш сборок.
Нажмите кнопку Пуск и выберите команду Выполнить.
Введите cmd и нажмите кнопку OK, чтобы открыть окно командной строки.
В окне командной строки перейдите в каталог, где находится скомпилированный класс обертки. На моем компьютере это: C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005 \Projects\NetFxWrapper\NetFxWrapper\bin\Release.
Введите "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" -i NetFxWrapper.dll. Примечание Обратите внимание на то, что путь к gacutil заключен в кавычки. Вы должны получить сообщение, что сборка успешна добавлена в глобальный кэш сборок. При развертывании приложения Visual Basic 6, использующего класс обертки, вашему мастеру установки потребуется использовать gacutil для установки класса обертки в глобальный кэш сборок.
Сравнение вариантов
Хотя эта статья уделяет основное внимание рекомендациям по использованию подхода слияния Visual Basic, стоит на некоторое время задуматься о всех возможных вариантах подхода к приложениям Visual Basic 6 и определить, является ли слияние Visual Basic или какой-то другой подход наилучшим вариантом для конкретного приложения Visual Basic 6.
Возможные варианты включают поддержку приложения Visual Basic 6 в существующем виде, перевод всего приложения на .NET или использование технологии слияния Visual Basic. Каждый из них является наиболее подходящим для определенных ситуаций.
Поддержка как есть
В этом варианте вы сохраняете приложение, написанное на Visual Basic 6, как приложение Visual Basic 6 и совсем не используете .NET Framework.
Плюсы:
Простота: Приложение было написано на Visual Basic 6 (или перенесено на Visual Basic 6), поэтому сохранение его в таком виде является простейшим из вариантов. Скорее всего, ваши разработчики уже знают этот язык и среду разработки и могут быстро сделать много изменений или исправлений ошибок.
Минусы:
Добавление новых функциональных возможностей: Пакет Visual Studio 6.0 был выпущен в 1998 г. С той поры Visual Basic 6 не улучшался, за исключением пакетов обновлений. Зато изменились ожидания от функциональных возможностей современных приложений. От приложений зачастую ожидаются умение автоматически устанавливать обновления при выходе новой версии, возможности работать автономно и кэшировать данные локально, умение работать с Интернетом и, по возможности, взаимодействовать с веб-службами, и т. д. Хотя на сегодняшний день существуют технологии для облегчения этих задач, эти возможности недоступны в Visual Basic 6, поэтому создание таких улучшений исключительно в Visual Basic 6 может оказаться исключительно трудоемким. Конечным результатом будет то, что многие приложения Visual Basic 6 просто не будут дополнены новыми возможностями такого рода, потому что их слишком трудно и дорого делать только в Visual Basic 6.
Крайний предел: С момента представления Visual Basic .NET в 2002 г. начался переход разработчиков с Visual Basic 6 на Visual Basic .NET. В результате подавляющее большинство новых сведений по Visual Basic (книги, статьи, заметки в блогах и новостных группах, и т. д.) были о Visual Basic .NET. В то же время, количество доступной информации о Visual Basic 6 уменьшалось. В дополнение, многие разработчики считают, что переход на Visual Basic .NET благоприятнее для карьеры, поскольку этот язык будет обновляться и улучшаться. Это не попытка предположить, что на момент выхода этой статьи тяжело найти техническую поддержку по проблемам Visual Basic 6 или что тяжело нанять разработчика на Visual Basic 6, но ожидается, что со временемVisual Basic 6 последует по пути многих устаревших языков как в смысле доступности информации, так и в смысле доступности специалистов.
Переход на Visual Basic .NET
Этот вариант подразумевает полный перенос приложения Visual Basic 6 на Visual Basic .NET.
Плюсы:
Доступ к технологиям: Перенос приложения на Visual Basic .NET является лучшим способом гарантировать, что вы будете в состоянии быстро включать инновации и новые технологии. Корпорация Майкрософт и другие компании прилагают большую часть своих усилий для развития функциональности .NET Framework. Это означает, что новые пакеты SDK будут ориентированы в первую очередь на языки .NET, а, возможно, будут работать только с ними. Поддержка новых технологий, таких как веб-службы, автоматическое обновление приложений и возможности Интернет (поддержка протоколов HTTP и FTP) встроена в приложения .NET, но не будет перенесена на Visual Basic 6. Веб-узлы наподобие GotDotNet и SourceForge содержат тысячи распространяемых компонентов вместе с их исходным кодом, которые можно использовать напрямую из приложений .NET.
Производительность разработки: В дополнение, новые версии Visual Studio, которые гораздо более производительны, чем Visual Studio 6.0, можно использовать только для приложений .NET.
Минусы:
Риск: Полный перенос приложения Visual Basic 6 на Visual Basic .NET нетривиален. Если приложение важно, а разработчики не имеют опыта в Visual Basic .NET, есть риск, что перенос не удастся.
Время: Перенос приложения до состояния, когда оно выполняет в .NET то же, что оно делало в Visual Basic 6, занимает определенное время. Нельзя игнорировать временные и финансовые затраты, хотя это и закладывает гораздо лучшую основу для будущих улучшений.
Слияние Visual Basic
Слияние Visual Basic является технологией использования возможностей .NET из приложения Visual Basic 6.
Плюсы:
Доступ к технологиям: Создавая маленькие обертки Visual Basic .NET, можно иметь доступ ко всей библиотеке классов .NET Framework, вызывать веб-службы или использовать библиотеки .NET сторонних разработчиков или библиотеки .NET, лицензированные с открытым исходным кодом, в ваших приложениях Visual Basic 6.
Низкий риск: Большая часть кода приложения остается на Visual Basic 6 и продолжает работать как есть. Количество создаваемого вами кода Visual Basic .NET относительно невелико. Это означает, что нет риска неудавшегося переноса, поскольку вы не переносите все приложение. Кроме того, разработчикам без опыта в Visual Basic .NET требуется изучить лишь небольшие фрагменты .NET Framework для доступа к необходимым возможностям.
Высокий коэффициент окупаемости: Вложения в такой подход очень низки по сравнению с переносом всего приложения, поэтому коэффициент окупаемости высок, особенно в краткосрочном плане.
Минусы:
Visual Basic 6: Поскольку основная часть приложения остается на Visual Basic 6, вам необходимо продолжать использовать среду IDE Visual Basic 6 и язык Visual Basic 6 при работе над приложением. Этот язык и среда IDE не столь призводительны, как в Visual Basic .NET.
Отладка: Для эффективной отладки приложения, использующего и Visual Basic 6, и Visual Basic .NET, вам необходимо держать обе среды разработки открытыми одновременно, а, кроме того, требуются особые знания.
Разработка оберток: Для доступа к возможностям .NET в Visual Basic 6 приходится разрабатывать обертки классов .NET, чтобы они были представлены в виде объектов COM, доступных в Visual Basic 6. Эти обертки не требовались бы, если бы приложение было полностью перенесено на Visual Basic .NET.
Использование кода примеров
К этой статье прилагается код примеров, иллюстрирующих все обсуждаемые темы. Код примеров распакуется в папку «Best Practices Code». Внутри вы найдете следующее:
Install.bat - Используется для регистрации и установки оберток .NET, чтобы можно было использовать их в Visual Basic 6.
NetFxWrapper - Папка, содержащая исходный код классов оберток Visual Basic .NET.
Best Practices Visual Basic 6 - Папка, содержащая пример на Visual Basic 6, использующий класс обертки.
ComClass.zip - Содержит элемент проекта ComClass. Если поместить этот файл в папку Мои документы\Visual Studio 2005\Templates\ItemTemplates\Visual Basic, тогда шаблон этого элемента будет доступен в проектах Visual Basic Express.
Если у вас не установлены Visual Studio 2005 или Visual Basic Express, можно просто дважды щелкнуть install.bat, чтобы зарегистрировать классы оберток. Затем можно открыть проект Visual Basic 6, запустить его и проанализировать код, чтобы понять, как используются обертки.
Если у вас установлены Visual Studio 2005 или Visual Basic Express, можно также открыть исходный код классов оберток и проанализировать, как они построены.
Заключение
Слияние Visual Basic является полезным подходом для приложений Visual Basic 6, которые необходимо постоянно улучшать. Слияние Visual Basic обеспечивает доступ к любой возможности, предоставляемой .NET Framework, из существующих приложений без необходимости переписывать их. Чтобы воспользоватья слиянием Visual Basic, вы должны создать классы оберток Visual Basic .NET для доступа к возможностям .NET Framework. Зачастую эти классы оберток очень просты в написании, но они должны следовать определенным правилам, чтобы правильно представляться в виде объектов COM. В этой статье приведены рекомендации по созданию классов оберток и представлено руководство по определению того, какой подход, слияние Visual Basic или альтернативы, стоит использовать для существующих приложений Visual Basic 6.