Теперь, сгенерировав метаданные для .NET-клиента, попытаемся вызвать метод
GetAirlineTiming
нашего объекта СОМ из .NET-клиента. Вот клиентское приложение, написанное на
С#,
которое создает объект СОМ с помощью сгенерированных ранее метаданных и вызывает метод
GetAirlineTiming.
В этом примере мы используем раннее связывание. Я покажу вам еще два коротких примера, иллюстрирующих динамическое определение типов и позднее связывание.
using System;
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, а
у клиента есть доступ к номеру ошибки, описанию и источнику исключения, а также к другим деталям, доступным любому клиенту, поддерживающему СОМ. А теперь продолжим изучение этого примера и рассмотрим другие средства связывания с компонентами СОМ.