Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 239

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 233 234 235 236 237 238 < 239 > 240 241 242 243 244 245 .. 320 >> Следующая

' Прежде всего нам необходимо получить двигатель
Dim q as CoEngine
Set q = myCar.GetEngine
Теперь получаем цилиндры 01m strs As Variant strs = q.GetCylіnders
Теперь получаем все прозвища из SAFEARRAV ' и помещаем их в ListBox
Dim upper As Integer Dim і As Integer upper = UBound(Strs) For i = () To Upper
lstCylindertist.Addltem strs(i)
Ne^t і
End Sub
Код приложения VB6ATL можно найти в подкаталоге Chapter 12.
Создаем сборку и анализируем процесс преобразования
Давайте откроем командную строку и воспользуемся утилитой tlbimp.exe для создания промежуточной сборки для нашего СОМ-сервера CLassicATLCOMServer.dll:
tlbimp classicatlcomserver.dll /out:AtIServerAssemblу.dl 1
Теперь загрузим промежуточную сборку в ILDasm .exe и рассмотрим типы, которые были сгенерированы автоматически (рис. 12.20). Как можно видеть, в сборке появились аналоги .NETдля типов СагТуре, СоСаги CoEngine (то, во что превратились события СОМ-сервера, мы вскоре рассмотрим более подробно). Давайте разберемся с особенностями произведенных преобразований.
Преобразование библиотеки типов
При создании промежуточной сборки для СОМ-сервера (прокси-сборки) в пространстве имен .NET был создан аналог каждого типа СОМ (перечисления, со-класса, пользовательского интерфейса).
Первое, на что мы обратим внимание, - что атрибут [version] библиотеки типов был использован для определения версии сборки. Если мы обновим в коде IDL атрибут версии, увеличив номер версии до 9.7, примерно так:
[ uuid(69D8B2E2-4CCl-4414-9757-49C53620FF0С). version(9.7),
helpstring{"ClassicATLCOMServer 1.0 Type Library") ] library CLASS ICATLCQMSERV ERL і b
{ // Весь необходимый код...
)
Клиент СОМ-сервера в Visual Basic 6.0 593
Bis View Help
- v ]_
- > MANIFEST a V AtJSeiverAssembly s S СагТуре a ff CoCar e ? CoEngine ж P !Car ' а Л Engine a It JCar?rertis s O _lCart3vente_E«nt ш ? JCarEvents.ExplodedEventHaridler re Ш JCarEvents SlnkHelper Г _К _СоСаг
ІІ__. _
assembly AtJServerAssembly
а-
21Л
Рис. 12.20. Промежуточная сборка, созданная нами для СОМ-сервера
то в манифесте сборки мы сможем увидеть соответствующую информацию о мере версии сборки:
.assembly AtlServerAssembly
.ver 9:7:0:0
Преобразование интерфейсов СОМ
Когда в сборке .NET создается аналог интерфейса СОМ, он описывается при помощи разнообразных атрибутов из пространства имен System.Runtime. Inter-
opServi ces.
ПервыйHTiHiOVг. который используется для создания аналога, — атрибутGuIdAt -tribute. Конечно же, он нужен для записи информации об идентификаторе интерфейса (IID) в соответствии с тем, как этот идентификатор записан в IDL СОМ-
сервера.
Второй атрибут — InterfaceTypeAttribute. Он используется для хранения информации о том, как данный интерфейс был определен в коде IDL (custom, dual или euspinlerfecei. Для этого атрибута используются значения из перечисления ComIг -terfaceType (табл. 12.6).
Таблица 12.6. Значения перечисления ComlnterfaceType
Значение Описание
InterfaceIsDual Определяет, что интерфейс описан в СОМ-сервере как dual
InterfacelsDispatch Определяет, что интерфейс был описан как dispintertace
InterfacelsUn known Определяет, что интерфейс был описан как производный от !Unknown
594 Глава 12 » Взаимодействие с унаследованным программным кодом
¦ • Browser
frows«: Selected Components - ?ustwrfcB... j' j|' -
10b)acts- Vv : v. MB!*»« of •JPw«!»'
I ¦ м>цінц-т 1*1 fpConsoleAppliCation 1 ] B 'Q mscortb.dl ІВ -a system, data,dl ®"Osystm.dl — I Fl "_> sv5tem.xml.dll — 1.3 1.. IM і* lnftndOut(ref fi Ф Onl/IriPirainfilnt,«) \- -¦=¦ OnlyOutPsrams(out W,outint) i*Retval()
[xifc inter face IParams
Рис. 12.21. Интерфейс IParams перенесен в прокси-сборку
Общая схема преобразования определений параметров из кода IDL в код С# может выглядеть так, как представлено в табл. 12.7.
Для интерфейсов dual (как в нашем случае) атрибут іnterfaceTypeAt":":outs в прокси-сборке не используется. Вместо этого используется другой атрибут -TypeLibTypeAttribute, в котором и хранится информация о разновидности интерфейса типа dual (например, licensed, hidden, appobject и т. д.).
Преобразование атрибутов параметров в коде IDL
В классическом СОМ параметры помечаются при помощи набора атрибутов IDL. Эти атрибуты определяют направление передачи заданного аргумента. Они также нужны для правильного управления памятью. В наших соклаесах использовались параметры с атрибутами [1п]и [out. retval]. Другие допустимые значения — [out] и [ і n. out]. Чтобы проиллюстрировать все возможности, предположим, что в коде IDL вашего СОМ-сервера присутствует определение интерфейса IParams:
interface IParams : IDispatch t
Il Паранетры [in] генерируются вызывающим клиентом
[Id(D] HRESULT OnlyInPararas([in] int х. [in] int у):
Il Параметры [out] генерируются вызываемым методон
[idC2)] HRESULT OnlyOutParams([out] int* х. [out] int* у);
// Параметры [retval] - это исходящие параметры, который соответствуют физические // значения. Например, в VB это могло бы выглядеть как "ans * Retval О"
Предыдущая << 1 .. 233 234 235 236 237 238 < 239 > 240 241 242 243 244 245 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100