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

 

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

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

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

Точно так же, как и раньше, мы можем обратиться к свойству ОгІ verName, ЯВНО
получив ссылку на интерфейс IDriverlnfo:
// Устанавливаек значение свойства DrlverName и получаех это значение через ссылку // на интерфейс IDriverlnfo IDriverlnfo idi = (IDriverlnfo)viper:
idi,DriverName = "Fred":
Console Wr1iet.lnsC"Nens; of driver is: + idi .Drinterne!:
Однако если мы откроем ПрОКСИ-сборкув ILDasm.exe, то этих членов интерфейсов (например, свойства DriverName) мы в определении класса .NET СоСаг не найдем (рис. 12.23).
f D:\CSharpBook\Labs\Chapter i^VCIassicATl
ffc View EfIp
ШЯгт-|п|х|
«I
> daSS public MtO ansi
¦ > extends AtlServerAssembly._CoC ar
> ImplememsAttServerAssemblyjCarEvents.Ev
> xyeiom fcsSanesvoid {mscciStijSystem.RuiiftW' - > .custom instance void |mscarlib]Systom.Runlimi.
4/ Til iCa^E^nlsCf-1 private class frn»Cuilio]Syst<
V ^„ЗНОйг.Еу&ї^Зг'Є^З?'.? : pv^itf class [пт$спг!і 9 .ct^r: vfi'JO
• .ctor void')
• Dispose voitiO
[—• Fm5!i?.o :voidO И
• add_Exploded : void(class AtlServerAssambly.J •
Y Exploded AtlServe(^3^4^utj:y_JCarEv^n.r? _?x^ii K CoEngine
I V
,assembly WIServerAssembly
fr-'Jc".-_¦
1ІА
Рис. 12.23. Классы .NET не реализуют методы интерфейсов СОМ-сервероз напрямую
Откуда же берутся эти члены? Если разобраться повнимательнее, то МОЖНО заметить, что класс ,NETCoCt г является производным от другого класса .К hi Cr«. >:. г. И вот именно в этом базовом классе СоСаг" и определены все члены интерфейсов ІСаги IDriverlnfo (рис. 12.24).
Если обратиться к метаданным типов, то можно обнаружить следующее определение класса _СоСаг,
.class public auto ansi import _CoCar extends [mscorlіb]System,Object
implements CLASSICATLCOMSEFfVERLib. ICar, CLASSICATLCOMSERVERLIb.IDriverlnfo
{
Il Атрибут TypeLibTypeAttribute
Il Атрибут ComSourcelnterfacesAttribute
Il Атрибут GuidAttribute
Il Атрибут HasDefaultlnterfaceAttribute
// Конец определения класса _Со(-:г
598 Глава 12 'Взаимодействие с унаследованным программным кодом
Г D:\CSharpBcok\Labs\Chapter I Z\Oa«icATl.Cr)MS
FJIe B»w hslp
_ICarE?ents„SinkH8lper
> .class public auto ansi Import
> ImplementsAtlServerAssembly.lCar
Implements AtlSarverAssemWir.lDriverlnfo .custom Inslaneevold (mscortlti)System.Runlinnr; .custom instance void [mscoflit-JSrstem.Runtlrn, .custom instance void [mscorlib]System.Runtimi .custom instance void ImscorliblSyslem.Runtimi, .custom instance void ImscorliblSvslem.Runtimi. .ctor:voidO
OetCarType valuetypeAB8««t*e*em!»!».C»nv; GetCurSpeed lnr.320
GetEngina : class ASiSeiverAssembiyJEngineO SpeedUp :void(ir>132) gel_DnverName slfinpO • set.OioisrName :void(stnns) A Dirverlviame siiingQ "
У
.assembly AtlSeiverAssembly і
Рис. 12.24. Члены! интерфейсов определяются в дополнительном базовом классе
Преобразование перечислений СОМ
Перечисления СОМ отображаются в прокси-сборке для COM-СЄрвера в типы, производные от System.Enum. Таким образом, мы можем использовать любые из встроенных членов (к слову, очень полезных) этих типов ,NET. Например:
public static int Ma1n(string[] args)
{
// Вначале создаем объект «аа-сиобиль» СоСаг viper = new CoCarO :
II Далее получаем тип автомобиля
СагТуре t = viper.GetCarTypeO:
Consol е. WriteLine ("Ca г type: {Q)". t.ToStringO)
return 0;
Преобразование COM SAFEARRAY
Давайте рассмотрим на примере, как представляется тип COM SAFEARRAY в прокси-сборке для СОМ-сервера. Как мы помним, в интерфейсе IEngine у нас был определен единственный метод GetCyl Inders О, который возвращал массив объектов В STR. Обращение к интерфейсу lEngi ne из внешних клиентов производилось при помощи метода GetEngineO объекта СоСаг, Выглядело это обращение следующим образом:
//¦ Прежде есего создаен объект СоСаг СоСаг viper = new CoCarO;
Клиент СОМ-сервера в Visual Basic 6.0 599
II Далее получаем ссылку на интерфейс !Engine IEngine е » viper.GetEngineO:
Il Запрашиваем пассив SAFEARRAY через ссылку на интерфейс object о - е. GetCyl і nders О:
Наш массив SAFEARRAY был объявлен как массив типов VARIANT при помощи флагов VTj\RRAY и VT ВSTR:
STDNETHODIMP CCoEngine:iGetCyTіndersС VARIANT *arCylinders) {
Variantlnit(arCylinders); arCy!i"-;<?rs->vi: = VT AftRAV j VTJBTR:
і
// Здесь расположены разл,- ;;-ь:е элементы LiJM .
// Устанавливали возвращаемое значение arCyl inders ->parray = pSA;
return SJ>-:
}
Для целей, для которых в мире СОМ используется тип VARIANT, в мире ,NET используется System. Object. Учитывая, что SAFEARRAY в нашем случае заполнен етр; -ковыми значениями, мы можем вывести информацию о том, что представляет собой в нашей ситуации объект System. Object,прямо на консоль:
IEngine e = viper.GetEngan<?0:
objecto = e.GetCylindersO:
U о в нашей случае - объект System.StringQ
Copsoie.WritsLinero is really this type: {Of, o);
Для вывода прозвища каждого из цилиндров код может быть таким:
// Получаем массив строковых значений StringC] cylinders = (strlng[])o:
Il Выводим каждый элемент
Console.WriteLineC'Your cylinders are:"): froeach(string s in cylinders)
Предыдущая << 1 .. 235 236 237 238 239 240 < 241 > 242 243 244 245 246 247 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100