Вызов методов, свойств и событий

Клиент .NET может вызывать методы активного COM-объекта, изменять его свойства и перехватывать события, возникающие на сервере. Свойства и методы, используемые в этом разделе в качестве примеров кода, предоставляет компонентный класс Loan (неуправляемый код C++, ATL).

Вызов методов

Вызов методов COM-объекта из управляемого кода выполняется точно так же, как и вызов методов управляемого объекта. Так как COM-компоненты всегда реализуют свои функциональные возможности через интерфейсы, разработчик имеет возможность вызывать методы интерфейса или непосредственно компонентного COM-класса. Компонентный класс предоставляет только члены, реализуемые своим интерфейсом по умолчанию. В следующем примере программный код прямо вызывает метод GetFirstPmtDistribution для импортированного компонентного класса:

MorePmts = ln.GetFirstPmtDistribution(ln.Payment, Balance, _
               Principal, Interest)
MorePmts = ln.GetFirstPmtDistribution(ln.Payment, out Balance, 
               out Principal, out Interest);

COM-взаимодействие автоматически выполняет маршалинг типов данных. Например, при передаче типа System.String COM-объекту COM-взаимодействие преобразует этот тип в BSTR.

Параметры, отмеченные в библиотеке типов как [out retval], преобразуются в возвращаемые методом значения. В ходе преобразования эти параметры удаляются из управляемой сигнатуры. По умолчанию для управления кодом среда выполнения генерирует исключение, сопоставляя значение сбоя HRESULT с эквивалентным управляемым исключением.

Получение и задание свойств

COM-интерфейсы могут включать свойства в качестве членов интерфейса. Получить или задать свойство COM-объекта можно точно так же, как и при получении и задании свойств, предоставленных управляемым классом. COM-интерфейсы и компонентные классы, импортированные в сборку как метаданные, предоставляют свойства и методы доступа к каждому из них. В следующем примере кода задается значение свойства OpeningBalance.

ln.OpeningBalance = Convert.ToDouble(Args(1))
ln.OpeningBalance = Convert.ToDouble(Args[0]);

Сведения о преобразовании свойств см. в разделе Преобразование импортированного члена. Более общее описание свойств в .NET Framework см. в разделе Общие сведения о свойствах.

Обработка событий

Клиент .NET может обрабатывать события, инициируемые COM-сервером, точно так же, как он обрабатывает любые другие управляемые события. При импорте библиотеки типов сервера процесс преобразования создает делегаты, которые разработчик связывает со своими обработчиками событий. Сведения об этом процессе см. в разделе Обработка событий, вызванных COM-источником.

Обратите внимание, что COM-объектам, вызывающим события внутри клиента .NET, перед их освобождением требуются две коллекции сборщика мусора. Причиной этого является цикл ссылочный цикл, возникающий между COM-объектами и управляемыми клиентами. Если нужно явно освободить COM-объект, следует вызвать метод Collect дважды.

См. также

Задачи

Практическое руководство. Сопоставление значений HRESULT и исключений

Основные понятия

Использование COM-типов в управляемом коде

Преобразование импортированного члена

Общие сведения о свойствах

Пример COM-взаимодействия. Клиент .NET и COM-сервер

Другие ресурсы

Маршалинг взаимодействия