СТАТЬЯ |
31.10.02
|
©
Сурен Бехари, Gupta
Переведено БНТП по заказу Interface
Ltd.
В течение последующих нескольких лет большинство учреждений будут использовать значительное количество кода Team Developer, наряду с растущим объемом кода .NET. С помощью исполняемых служб взаимодействия .NET можно наилучшим образом заставить эти два кода работать совместно. Это позволяет писать приложения .NET (наподобие VB.NET), которые используют существующие COM-объекты Team Developer, а также писать приложения Team Developer, использующие библиотеки DLL, созданные в VB.NET. Можно создавать приложения .NET, увеличивающие отдачу от вложений в компоненты COM, и можно переносить DLL-библиотеки Team Developer в VB.NET, продолжая при этом использовать их функциональность из приложений Team Developer.
Исполняемые компоненты .NET предоставляют упаковщики для взаимодействия с технологией COM и обхода различий между .NET и COM
Я представлю некоторые ключевые концепции, касающиеся того, как система упорядочивает данные между платформами COM и .NET, и как это влияет на производительность. Когда код на любой из этих платформ вызывает метод объекта, функционирующего на другой платформе, то этот вызов метода требует упорядочивания (marshalling). В процессе упорядочивания пакет служб взаимодействия .NET (.NET Interop) упаковывает вызов метода, передает его на другую платформу, выполняет метод, упаковывает результаты, и затем передает их обратно на изначальную платформу (см. Рисунок 1). Когда процесс упорядочивания перемещает параметры с одной платформы на другую, это вызывает пиковое падение производительности.
Рисунок 1
Это падение производительности сильно зависит от типов данных в параметрах и от результирующих типов. Наилучшая производительность достигается при перемещении простых числовых данных, таких как 32-разрядные целые числа. Они представляют собой изоморфные типы данных, которые на обеих платформах представляются в памяти одинаково. Следовательно, взаимодействие с ними происходит почти так же быстро, как обычный вызов метода. Можно просто копировать изоморфные данные из памяти COM в память .NET (или наоборот).
Изоморфными типами данных Team Developer являются Number и String. Одномерные массивы изоморфных типов также изоморфны, поскольку они содержат только изоморфные типы.
Другие типы данных требуют большей работы в процессе упорядочивания, поскольку на платформах .NET и COM они представляются разным образом. Такие типы данных, как Boolean, являются неизоморфными, и могут требовать преобразования из одного формата в другой, а также нескольких дополнительных циклов в процессе копирования с одной платформы на другую.
Службы взаимодействия с .NET предоставляют четыре типа упорядочивания. Из них только Тип I автоматически поддерживается службами взаимодействия и Visual Studio .NET (VS.NET). Если необходимо преобразовать один тип данных в другой, то сложные данные надо передавать как единое значение (такое как Variant), либо представить один тип объекта как другой объект. Осуществлять другие типы упорядочивания необходимо вручную путем редактирования кода на языке Microsoft Intermediate Language (MSIL) в редакторе Notepad, вместе с другими действиями.
При использовании типов данных, которые поддерживаются Типом I упорядочивания, вызов COM-объекта Team Developer из приложения VB.NET и наоборот происходит быстро и практически прозрачно. Так что по возможности следует избегать использовать тип данных Variant, поскольку обычно это приводит к проблемам. Я покажу Вам, как использовать Тип I упорядочивания, поскольку в своих приложениях Вы, скорее всего, будете использовать именно этот тип.
Структура объектной модели .NET и ее работа отлична от компонентной объектной модели (COM - COMponent Object Model) и ее функционирования. Например, клиенты компонентов .NET не должны беспокоиться о сроке жизни своего объекта. Общий язык выполнения (CLR - Сommon Language Runtime) берет на себя решение подобных проблем. В противоположность этому, клиенты объектов COM должны заботиться о сроке жизни своего объекта. Аналогично, объекты .NET существуют в пространстве памяти, управляемом CLR. CLR может перемещать объекты в памяти по соображениям производительности, и в соответствии с этим обновлять ссылки на объекты, а клиенты объектов COM располагают реальным адресом объекта в памяти и рассчитывают на то, что объект останется в том же месте памяти.
Аналогично, исполняемые компоненты .NET предоставляют много новых возможностей и конструкций для управляемых компонентов. Например, компоненты .NET могут иметь параметризованные конструкторы, функции компонентов могут иметь связанные с ними атрибуты доступности (подобно атрибутам публичный (public), защищенный (protected), внутренний (internal), и др.), а компоненты могут также иметь статические методы. Наряду с этими возможностями, есть еще и много других. Среди них есть и недоступные для клиентов COM, поскольку стандартная реализация COM не распознает эти функции. Поэтому исполняемые компоненты .NET должны привнести нечто, действующее как посредник между сервером .NET и клиентом COM.
Исполняемые компоненты .NET предоставляют упаковщики для взаимодействия с технологией COM и обхода различий между средами .NET и COM. Например, когда клиент .NET получает доступ к объекту COM, исполняемый компонент создает экземпляр вызываемого упаковщика COM (CCW - Com Callable Wrapper). Точно также при доступе клиента .NET к компоненту COM создается экземпляр исполняемого вызываемого упаковщика (RCW - Runtime Callable Wrapper). Эти упаковщики абстрагируют различия и предоставляют удобную интеграцию двух сред. Рисунок 2 иллюстрирует CCW и RCW.
Рисунок 2
VS.NET автоматически создает скомпонованный блок (assembly) исполняемого вызываемого упаковщика (RCW)
VS.NET позволяет использовать и ссылаться на DLL-библиотеки COM очень похоже на то, как используют и ссылаются на DLL-библиотеки .NET. Начните с создания простой DLL-библиотеки COM в Team Developer, как показано на Рисунке 3.
Рисунок 3
После создании проекта Вы получите простую DLL, которая возвращает текстовое значение. Эту DLL можно прозрачно использовать из .NET, поскольку Тип I упорядочивания поддерживает оба типа данных.
Перед использованием любой DLL в VB.NET необходимо добавить в проект ссылку на нее. Это верно для DLL как .NET, так и COM, и VS.NET позволяет добавлять ссылки на оба типа DLL из одного диалогового окна.
В VS.NET для вызова диалогового окна Add Reference (Добавить ссылку) используется пункт меню Project | Add Reference (Проект | Добавить ссылку). Щелкните закладку COM, после чего появится список всех компонентов COM, зарегистрированных в настоящий момент в системе. Пролистайте список и выберите позицию COMObject (см. Рисунок 4).
Рисунок 4
После нажатия на ОК VS.NET автоматически создает скомпонованный блок исполняемого вызываемого упаковщика (RCW). Этот важный этап происходит в фоновом режиме. RCW является скомпонованным блоком .NET, который для кода .NET выглядит во многом так же, как DLL-библиотека COM. Код, который вызывает компонент COMObject, на самом деле вызывает RCW, который затем вызывает от Вашего имени нижележащие компоненты COM. RCW заботится о процессе упорядочивания, совершая реальный вызов с платформы .NET платформы COM. Он также может позволить совместно использовать компоненты COM среди нескольких приложений .NET.
Добавьте в форму управляющие элементы TextBox (Текстовое окно) и Button (Кнопка), затем для вызова кода окна дважды щелкните на управляющем элементе Button. Добавьте этот код внутрь события Click (Щелчок):
Данный код создает экземпляр компонента COMObject, а затем для заполнения дисплея вызывает метод. Затем этот код вызывает Marshal.ReleaseCOMObject, чтобы освободить ссылку на нижележащий COM-объект. Вы проделываете то же самое при вызове Object.Release() в Team Developer, поскольку COM-объекты уничтожаются при их освобождении, и они ожидают освобождения после того, как их использовали.
С другой стороны, объекты в VB.NET не уничтожаются до тех пор, пока алгоритм "сбора мусора" в .NET не дойдет до них. Вызов ReleaseCOMObject заставляет .NET более близко имитировать поведение платформы COM - это хорошая идея при работе с объектами COM.
Перед тем, как этот код заработает, необходимо добавить в начало файла оператор Imports:
Таким образом, создается пространство имен для размещения класса Marshal.
Теперь можно запустить приложение и нажать на кнопку. Затем форма отобразит данные, полученные от DLL-библиотеки COM в Team Developer (см. Рисунок 5).
Рисунок 5
Cлужбы .NET Interop предоставляют простой способ повторно использовать существующие в Team Developer объекты COM из VB.NET, а также использовать DLL-библиотеки VB.NET из Team Developer
Это почти так же просто, как обратный процесс. Конечно, без Вашего вмешательства основанный на технологии COM клиент, такой как приложение Team Developer, не сможет использовать библиотеки VB.NET. Для этого надо предпринять несколько шагов.
Создайте в VS.NET новый проект Class Library (библиотека классов) под названием ManagedClass. Уберите код шаблона из файла Class1.VB и затем впишите приведенный далее код, а затем переименуйте Class1.VB в ManagedClass.VB:
Данный код предоставляет ту же самую функциональность, что и DLL-библиотека COM, созданная Вами ранее для того, чтобы она была доступна в Team Developer. Используйте атрибут <InterfaceTypeAttribute()> для того, чтобы пометить управляемый INETInterface как только IDispatch после того, как он станет доступен в COM.
Конечно, для идентификации Вашего класса COM полагается на глобальные уникальные идентификаторы (GUID - globally unique identifier). Если Вы их не обозначите, то .NET автоматически создаст некоторые из них.
Необходимо пометить и сам проект, чтобы зарегистрировать в VS.NET библиотеку DLL с COM. Щелкните правой кнопкой мыши на проекте ManagedClass в Solution Explorer и выберите Properties (Свойства). Щелкните на Configuration Properties (Свойства настройки) и Build (Скомпоновать) в левой панели, и проверьте опцию под названием Register for COM Interop (Зарегистрировать для взаимодействия с COM) (см. Рисунок 6).
Рисунок 6
При включении этой опции в следующий раз при компоновке решения VS.NET создаст COM-вызываемый упаковщик (CCW - COM-callable wrapper) и библиотеку типа COM для Вашего класса. VS.NET также регистрирует DLL в реестре Windows, делая их доступными в для Team Developer. Все это происходит незаметно - единственной видимой индикацией является линия в окне Output.
CCW имеет сходство с RCW, который был создан ранее в VS.NET. Этот скомпонованный модуль управляет упорядочиванием и всеми сведениями, которые позволяют клиентскому приложению COM использовать объект VB.NET. Скомпонуйте проект для создания DLL, затем откройте среду разработчика Team Developer IDE.
Сохраните проект как .NETClient.apt. Откройте ActiveX Explorer и найдите компонент ManagedClass. Можно сгенерировать SAL-представитель, подобно тому, как это делается для любого компонента COM (см. Рисунок 7).
Рисунок 7
Теперь добавьте Common Language Runtime Library.apl в раздел Libraries (Библиотеки). Создайте новое окно формы (Form Window) и добавьте туда поле данных (Data Field) и кнопку (Pushbutton). Создайте экземпляр INETInterface и добавьте к Pushbutton следующий код:
Наконец, запустите приложение и нажмите на кнопку. На дисплее должно появиться значение, полученное от скомпонованного модуля VB.NET (см. Рисунок 8).
Рисунок 8
Вот что необходимо сделать для получения доступа к компонентам .NET из неуправляемого кода. Если Вы хотите разрабатывать некоторые из компонентов своего приложения в .NET, то Вам необходимо учесть, что многие возможности компонентов .NET недоступны клиентам COM. Это потребует некоторых решений в период проектирования и может оказать влияние на способ проектирования иерархии объектов (поскольку иерархия наследования компонентов .NET для клиентов COM представляется более плоской).
Службы .NET Interop предоставляют полезный и обычно несложный способ повторно использовать существующие COM-объекты Team Developer из VB.NET, и использовать DLL-библиотеки VB.NET из Team Developer во время миграции компонентов. В большинстве случаев службы Interop делают за Вас всю тяжелую работу, а VS.NET часто автоматизирует этот процесс. Если Вы создаете многопоточные .NET-приложения или передаете сложные типы данных через тип данных Variant, то это более сложно и при этом необходимо больше делать вручную.
Файл Dotnet.zip
Дополнительная информация
За дополнительной информацией обращайтесь в компанию Interface Ltd.
Обсудить на форуме Gupta Technologies
INTERFACE Ltd. |
|