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

 

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

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

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

[id(3)J HRESULT Retval ([out. retval] int* answer);
//Параметры [in, out] генерируются вызывающим клиентом, однако могут быть
// изменены вызываенын методом
[1СІ43] HRESULT InAndCU<[iп. out] int* byRef=3ra:n>:
}:
Если мы создадим для СОМ-сервера с таким определением интерфейса про-кси-сборку при помощи утилиты tLbimp.exe, то сможем обнаружить, что каждой из приведенных разновидностей параметров подобран свой аналог .NET. Выглядеть наш интерфейс IParams в прокси-сборке, если открыть его в Object Browser, может так, как представлено на рис. 12.21,
Клиент СОМ-сервера в Visual Basic 6.0 595
Таблица 12.7. Преобразование атрибутов параметров IDL в ключевые слова С#
Атрибут
параметра в IDL
[in] [out]
[п, out]
[out, retval]
Ключевое слово для параметра в С#
Ключевого слова не предусмотрено — это направление передачи параметра по умолчанию
out ref
Нет
Описание
Вызываемой функции передается копия данных
Значение генерируется вызываемой функцией и передается вызывающему клиенту
Значение генерируется вызывающим клиентом, однако оно может быть изменено вызываемой
функцией
Эти параметры становятся физическими значениями, возвращаемыми функциями. При преобразовании в .NET фактически эти параметры удаляются (преобразуются в тип «ж:)
Преобразование иерархии интерфейсов
Несмотря на то что в нашем С OM -о.'рисро нет иерархии пользовательских интерфейсов, предположим (для примера), что у нас появился еще один интерфейс ITurboEngine, производный от IEngine. Код IDLдля него может выглядеть следующим образом:
interface I rurtoEni-rne : Engine {
HRESULT PowerBoostO;
}-¦
В процессе преобразования производный интерфейс будет представлен как объединение всех методов, определенных во всех базовых интерфейсах и в самом этом интерфейсе (рис. 12.22). Таким образом, если мы исследуем ITurboEngine при помощи
то мы обнаружим, что он поддерживает не только свой метод .но и метод GetCyl і nders (), который был определен в базовом интерфейсе. Обратите также внимание, что имя базового интерфейса помечено тегом [ І~ЮІeint'HtS ].
I f D:\CSlHrpBook\UlK\Clidpter 12\.СІаЬ5!сАТІСҐ>М<й*.ГнгаВ|

, геУИШИ і- ,S-J(WS тт$ public aoSlract auto ansl Import > implements AUSeiYerAssembly.lEncjin в — > .custom Instance void ImscoriiblSystsm.Runtim .¦ > .custom instancevold [mscortibJSvstem.Runtlm -., > ,custom instance void [mscortlB)System,Runtim GetCylinclers: objecto ¦ PowerSoost :voldO s {? iCarEvents <l I
.assemblyAUServerAsseiinbly ( л V,
U A Л
Рис. 12.22. Производные интерфейсы поддерживают все члены базовых интерфейсов
596 Глава 12 Взаимодействие с унаследованным программным кодом
Преобразование и свойств СОМ
Как мы уже могли убедиться на примере с СОМ-сервером в Visual Basic, при создании прокси-сборки для СОМ-серверапри помощи утилиты tLbimp.exe специальные классы .N ET создаются не только для каждого интерфейса, но и для всего сокласса в целом. Поэтому в прокси-сборке у нас появился новый класс ,NETc именем СоСаг. Работать с ним можно двумя способами. Первый способ -создать объект сокласса и получить доступ к членам интерфейсов через этот объект:
// Реально мы обращаемся к члену интерфейса [default] СоСаг viper - new CoCarO; viper. SpeedUpOO);
Второй способ — явно запросить ссылку на интерфейс и работать уже через него:
// Явно получаем ссылку на интерфейс ICar СоСаг viper new CoCarO: ICar ic = (ICar)viper: ic.SpeedUpOQ);
В нашем примере и класс СоСаг, и класс CoEngine реализуют только по одному
пользовательскому интерфейсу (которые одновременно являются интерфейсами
по умолчанию). Однако предположим, что мы определили еще один интерфейс с единственным свойством СОМ (типа BSTR):
interface mriverlnfo : IDispatch {
[idd). propget, heipstripgC"property DriverName")] HRESULT С": verfeme ([cut. retval] BSTR «рїа-3:
[1d(D. propput. helpstringC'property DriverName")] HRESULT DriverName([in] BSTR newVal):
}:
Также предположим, что наш класс СоСаг реализует этот интерфейс. Реализация будет несложной — при помощи этого свойства можно будет устанавливать
значение типа BSTR или возвращать это значение:
codas; СоСаг {
[default] interface JCar; interface IDriverlnfo;
[default, source] displnterface JCarEvents:
}:
Теперь, когда сокласс СоСаг реализует два пользовательских интерфейса, интересно будет разобраться, как все это будет представлено в его аналоге в прокси-сборке .NET. Как вы, наверное, уже догадываетесь, класс .NET будет поддерживать каждый член каждого из этих двух интерфейсов. Другими словами, если мы создадим объект класса .NETСоСаг, то сможем воспользоваться и методом SpeedUp(), HGetCurrentSpeedO, HGetEngine(), nGetCarTypeO и работать со свойством DriverName:
// Обратите вникание, что мы обратиться к свойству, определенному в IDriverlnfo // напрямую через объект класса, реализующего этот интерфейс СоСаг viper = new CoCarO:
Клиент СОМ-сервера в Visual Basic 6.0 597
viper. DriverName = "Fred";
Console.Wri teLi пе(V і per.Dri verName):
Предыдущая << 1 .. 234 235 236 237 238 239 < 240 > 241 242 243 244 245 246 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100