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

 

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

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

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

(
Console. Wri teLineC "->" + s);
}
To, что должно получиться, представлено на рис. 12.25.
' ^ D:\t5hdrpBDok\Te5ts\ConsoleAppfoationl p . JOJ xj
d is really this type: Systen.StringC1 Your cylinders «Mt -^Grinder ->0ily ->Thumper Press any &sy to Conti Іти: Rl ті
R Г
Рис. 12.25. Вывод каждого элемента SAFEARRAY на консоль
600 Глава 12 • Взаимодействие с унаследованным программным кодом
Здорово, не правда ли? Таким образом, мы можем использовать значения из СОМ SAFEARRAY в коде .NET без каких-либо проблем. Следующий пункт, с которым мы должны разобраться, — как организовано представление событий СОМ в .NEl,
Перехват событий СОМ
Модель событий .NET в этой книге рассматривалась в главе 5. Напомним вкратце ее основные положения. Архитектура модели событий .NET основывается на делегировании логики выполнения от одной части приложения к другой. Для подобного делегирования используются типы, производные от System,HjItі ca^LDelsgate. Клиент может добавлять и удалять приемники событий из внутреннего списка при помощи перегруженных операторов += и .
Когда утилита tlbimp.exe в процессе преобразования встречает интерфейс [source] в библиотеке типов СОМ-сервера, она создает набор типов .NET, которые послужат оболочкой для низкоуровневой архитектуры точек соединения СОМ. Можно сказать, что в прокси-сборке создаются эквиваленты .NFiT для событий СОМ. Например, как мы помним, в нашем соклассе СоСаг был определен следующий исходящий интерфейс:
dispinterface _ICarEvents 1
properties: methods:
[idd). helpstring("method Exploded")] HRESULT E*piod<?d([isij BSTR deacnsg );
Встретив такой интерфейс, утилита tlbimp.exe создала набор типов для точного представления системы событий СОМ-сервера (архитектуры точек соединения) в системе событий .NET. Эти типы приведены в табл. 12.8.
Таблица 12.8. Соответствия сгенерированных элементов системы событий NEf элементам системы событий СОМ
Сгенерированный тип Описание
(для интерфейса
_CarEvents [source])
ICai-Events Интерфейс ,NE" - аналог исходящего интерфейса
СОМ-сервера. Обычно напрямую не используется
_IC3rEvents_Event Интерфейс .NET, определяющий члены для добавления
и удаления методов из встроенного списка System.MulticastDelegate. Обычно также напрямую не используется
_ICarEvents_&<plodedEventHandler Делегат .NET (тип, производный от System.MulticastDelegate).
Обработчик события должен обязательно возвращать значение типа int. Этот тип соответствует исходному событию СОМ
„ICarEvents_SinkHelper Этот сгенерированный класс реализует исходящий интерфейс
в объекте-приемнике .NET. Этот класс присваивает значение cookie, сгенерированное типом СОМ переменной m_dwCookie. Кроме того, в этом классе предусмотрена внутренняя переменная m„ExplodedDeJegate, представляющая исходящий
_ интерфейс (_ICarEvents_ExplodedEventHandler)
Клиент СОМ-сербєра в Visual Basic 6.0 601
Помимо сгенерированных типов, представленных в табл. 12.8, конечно, для системы событий вносятся изменения и в определение класса .NET СоСаг. В определении этого класса мы сможем обнаружить новое событие Exploded:
.class public auto ansi СоСаг
extends AtlServerAssembly._CoCar implements AtlServerAssembly._ JCarEvents
Event
(
класса СоСаг
} // Конец
В классе NET CoCar предусмотрено два метода, определенные как pri vate, которые обслуживают соединение с источником событий СОМ - add_X и remove X (рис. 12.26).
/ D:\CSharpBookUabs\Chapler 12\CIassicAT.
Fie View Help
Dispose :voidO Finalize: voidO
ddu .E;:|llod('i.l VfIIiJ(IlJs:= HllSeTWSWSSembly.JC
¦ reinove.Exploded : W)id(class AuServerAssembry---Т Exploded rAIISetverASsemoly.JCar&rents.Exploi
.assemblyAtlServerAssembly
GT
Рис. 12.26. Собьтия COM обслуживаются при помощи набора из двух функций
Если мы заглянем в код инструкций IL для метода add_Expl oded, то сможем обнаружить, что при его выполнении создается новый объект lCarEventr,_Si пріє і per. После этого прокси-сборка получает ссылку на интерфейс IConnectionPoint из СОМ-сервера СоСаг, вызывает метод AdviseO и кэширует возвращаемое значение cookie. Вот соответствующие инструкции в коде П.. (еще раз отметим, что для нормальной работы полностью разбираться в тонкостях IL вовсе не обязательно):
..method public virtual instance void addJExploded (class
AtlServerAssembly._ICarEvents_ExplodedEventHand1er A 1) cil managed
II Создается вспомогательный объект приенника
ILJOOO ILJ005 IL 0006 IL~0007 ILJ008 IL 000c
newobj instance void AtlServerAsserably. stloc.O Wc 14.0 stloc.l ldarg 0 ldfld class
_ICarEvents_SlnkHelper: : .ctor()
// Получаем ссылку на интерфейс IConnectionPoint
[mscorli bJSystem.Runtime.InteropServices.UCOMIConnectionPoint
At 1 ServerAs sernbly. CoCa r:: m_I Ca rEvent sCP
IL 0011: 1dloc.0
IL_0012: castclass [mscorlib]System,Object IL 0017: ldloca.s V 1
602 Глава 12 • Е5заимодейст8ие с унаследованным программным кодом
IL_0019: call vi rt instance void Il Вызываем метод IConnectionPoint: :AdviseO
Предыдущая << 1 .. 236 237 238 239 240 241 < 242 > 243 244 245 246 247 248 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100