Поиск

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

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