Принципы объектно-ориентированного программирования

         

Раннее связывание с компонентами СОМ



Раннее связывание с компонентами СОМ

Теперь, сгенерировав метаданные для .NET-клиента, попытаемся вызвать метод GetAirlineTiming нашего объекта СОМ из .NET-клиента. Вот клиентское приложение, написанное на С#, которое создает объект СОМ с помощью сгенерированных ранее метаданных и вызывает метод GetAirlineTiming. В этом примере мы используем раннее связывание. Я покажу вам еще два коротких примера, иллюстрирующих динамическое определение типов и позднее связывание.

using System;



using System.Runtime.InteropServices;

using System.Reflection;

using AIRLINEINFORMATIONLib;

public class AirlineClientlApp

{

public static void Main() <

/// ПРИМЕР РАННЕГО СВЯЗЫВАНИЯ ///

/// String strAirline = "Air Scooby 1C 5678"; String strFoodJunkieAirline = "Air Jughead TX 1234"; | try

\ <

i Airiinelnfo objAirlinelnfo;

// Создать новый объект Airiinelnfo. objAirlinelnfo = new AirlinelnfoO;

// Отобразить выходную информацию после вызова

// метода GetAirileTiming.

Console.WriteLine("Details for Airline {0} -> {1}",

strAirline,objAirlinelnfo.GetAirlineTiming(strAirline));

// Ошибка: в результате выполнения следующего кода // будет сгенерировано исключение! // Console.WriteLineC'Details for Airline {0} -> {1}", // strFoodJunkieAirline,objAirlinelnfo.GetAirlineTiming // (strFoodJunkieAirline)); >

catch(COMException e) {

Console.WriteLine("Oops- We encountered an error " +

"for Airline {0}. The Error message " + "is : {1}. The Error code is {2}", StrFoodJunkieAirline , e.Message,e.ErrorCode); } } }

Все происходящие здесь события — результат того, что исполняющая среда создает RCW, которая увязывает методы и поля классов метаданных с методами и свойствами, предоставленные интерфейсами, которые реализованы объектом СОМ. Для каждого объекта СОМ создается по одному экземпляру RCW. Исполняющая среда .NET занимается только управлением сроком жизни RCW, а сборщик мусора утилизирует отслужившую свое оболочку. Именно RCW заботится о поддержке счетчиков ссылок на объект СОМ, которому она соответствует. Таким образом, RCW избавляет исполняющую среду .NET от управления счетчиками ссылок на реальный объект СОМ. Метаданные Airlinelnfo определены в пространстве имен AIRLINEINFORMATIONLib (рис. 17-2). .NET-клиент воспринимает все методы интерфейса так, как если бы они были членами класса Airlinelnfo. Все, что нам нужно сделать, — это создать эк- / земпляр класса Airlinelnfo с помощью оператора new и вызвать открытые f методы класса созданного объекта. При вызове метода RCW осуществ- ) ляет шлюзование этого вызова в вызов соответствующего метода СОМ./ RCW также решает все вопросы, связанные с преобразованием и сроком/ жизни объекта. .NET-клиент воспринимает это просто как создание тиг пичного управляемого объекта и вызов одного из его открытых членов! Каждый раз, когда метод СОМ генерирует ошибку, ошибка СОМ перехватывается RCW. Далее эта ошибка преобразуется в эквивалентный класс COMException (он находится в пространстве имен System.Runtime.In-teropServices). Конечно же, СОМ-объект все равно должен реализовывать интерфейс ISupportErrorlnfo, чтобы передавать ошибки. Это позволяет RCW узнать, что ваш объект обеспечивает расширенную информацию об ошибках. Ошибку может перехватить .NET-клиент, используя обычный механизм обработки исключений try-catch, а у клиента есть доступ к номеру ошибки, описанию и источнику исключения, а также к другим деталям, доступным любому клиенту, поддерживающему СОМ. А теперь продолжим изучение этого примера и рассмотрим другие средства связывания с компонентами СОМ.

 

Содержание раздела