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

 

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

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

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 224 225 226 227 228 229 < 230 > 231 232 233 234 235 236 .. 320 >> Следующая

Еще раз отметим, что на каждый СОМ-сервер нужен один модуль RCW1 вне зависимости оттого, к какому количеству интерфейсов в этом СОМ-сервере обращается клиент .NET. Каждый модуль RCW содержит в себе информацию об одном-единственном модуле СОМ и только о нем. При этом модуль RCW' используется также для отслеживания ссылок на объекты СОМ, созданные из ..NET, обеспечивая при этом сборку мусора и прочие принципиальные возможности
570 Глава 12 • Взаимодействие с унаследованным программным кодом
9
Клиент .NET
Рис. 12.1. RCW функциодарует как промежуточный уровень между клиентом и СОМ-сервером
Я думаю, что кас обрадует сообщение, что RCW создавать вручную не нужно — это производится автоматически при помощи утилиты tlbimp.exe (от type library importer - импортер библиотеки типов). Еще одна новость (впрочем, ожидаемая), которая может поднять вам настроение, заключается в том, что для нормального взаимодействия с клиентами .NET в унаследованные СОМ-классы не придется вносить никаких изменений. Всю необходимую работу берут на себя модули RCW. О том, как они это делают и каким образом можно их настроить — в следующих разделах.
Представление типов СОМ как типов .NET
За чтобы типы СОМ представлялись типам .KET как такие же модули ,КЕТ, отвечают программные модули RCW. Предположим, что в модуле СОМ определен метод (входящий в интерфейс), который описан в IDL:
// Определение метода СОМ в 1OL
HRESULT DisplayThisString([in] BSTR msg);
Модуль RCW представляет этот метод клиенту следующим образом:
// Представление нетода СОМ в Ci void DisplayThisString(String msg):
У подавляющего большинства типов СОМ (включая [oleautomat і on]-совместимые типы) есть соответствующие им типы в .NET. Эти соответствия приведены в табл. 12.4.
Естественно, при работе с указателем в IDL (например, int* вместо int) этот указатель будет отображаться в соответствующий базовый класс (System. mt32/i nt). Ниже в этой главе, когда мы создадим наш собственный сервер COM ATL, мы рассмотрим вопросы, связанные с представлением более интересных типов данных, таких как SAFEARRAYh перечисления СОМ.
Управление ссылками на объекты со класса
Как мы уже говорили, еще одна важная «зона ответственности» RCW заключается в отслеживании ссылок на сокласс СОМ. При обычном использовании соклас-совв среде СОМ в этот процесс вовлечены и клиенты сокласса, и сам сокласс, ауправ-ление ссылками производится при помощи вызовов методов AddRefO и ReleaseO. Классы СОМ саморазрушаются, когда более нет внешних ссылок на них.
Изаимодойсівио и COM 571
Таблица 12.4. Соответствие встроенных типов СОМ с типами ,NET
Тип COM (IDL) Тип .NET Псевдоним в
char, boolean, small System.SByte sbyte
wchar_t, short System.Intl6 short
long, int System. ЇГ02 int
hyper System. Int64 long
unsigned char, byte System.Byte byte
unsigned Short System. ushort
unsigned long, unsigned int System. UInt32 uint
unsigned hyper System.UInt64 ulong
single System.Sfngte float
double System.Double double
VARIANT„BOOL Her bool
HRESULT System,Int32 int
BSTR System.String string
LPSTR или char* System.String string
LPWSTR или wcharj:* System.String string
VARIANT System.Object object
DEOMAL System. Decimal Нет
DATE System. Нет
GUID System. Guid Нет
CURRENCY System. Decimal Нет
IUnknown* System.Object object
IDispatch* System.Object object
Однако в мире .NET такая схема не используется, поэтому для обеспечения нормального взаимодействия с СОМ-сервером клиент .NETдолжен был быв нужный момент времени производить вызов метода Releasee). Ксчастью, этого нетребуется: как обычно, всю черновую работу берет на себя модуль RCW. Он производит кэширование всех ссылок на интерфейсы и в нужный момент производит вызов метода Release() для сервера СОМ, на который больше нет активных ссылок со стороны клиентов .NET, В результате клиентам .NETнет необходимости явно производить вызовы методов AcIdRefО, Releasee) или OuerylrterfaceO.
Сокрытие низкоуровневых интерфейсов СОМ
Поскольку модуль RCWдолжен представить типы СОМ для клиента .ЫЕТточно так же, как будто это обычные типы .NET1 он должен уметь также скрывать низкоуровневые интерфейсы СОМ. Во многих отношениях поведение модуля RCW в этой ситуации напоминает Visual Basic 6.0.
Например, когда мы создаем класс СОМ, который поддерживает интерфейс IConnectionPointContainer (и поддерживает подчиненный объект или два вспомогательных интерфейса onPoi nt), сокласс имеет возможность пересылать сообщения о событиях обратно клиенту СОМ. При использовании клиента СОМ,
572 Глава 12 • Взаимодействие с унаследованным программным кодом
созданного на С++, нам потребуется создать приемник события, который реализует интерфейс [source], получить ссылку на интерфейс IConnectionPoint, вызвать метод Advi и проделать еще множество шагов по установлению соединения.
При создании клиента СОМ на Visual Basic 6.0 большая часть этого процесса полностью сокрыта (достаточно использовать ключевое слово к4 inlivsnt;.). Модуль RCW точно так же прячет всю рутину СОМ при создании клиента '. Все низкоуровневые интерфейсы СОМ-сервера полностью сокрыты от клиента СОМ, поэтому он видит (и, соответственно, может с ними работать) только пользовательские интерфейсы, реализованные в соклассе. Некоторые из интерфейсов СОМ, которые скрывает модуль RCW, представлены в табл. 12.5.
Предыдущая << 1 .. 224 225 226 227 228 229 < 230 > 231 232 233 234 235 236 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100