Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

using System.Runtime.InteropServices;

Type objCustomerTableType;

objCustomerTableType = Type.GetTypeFromProgID("DataAccess.CustomerTable");

Когда имеется объект

Type
, инкапсулирующий информацию о типе объекта COM, он используется для создания экземпляра самого объекта COM. Это реализуется передачей объекта
Type
в метод класса
CreateInstance
класса
Activator.CreateInstance
создает экземпляр объекта COM и возвращает на него ссылку позднего связывания, которую можно сохранить в ссылке типа object.

object objCustomerTable;

objCustomerTable = Activator.CreateInstance(objCustomerTableType);

В этом месте код C# имеет ссылку позднего связывания на готовый экземпляр класса COM.

К сожалению, невозможно вызывать методы непосредственно на ссылке типа

object
. Чтобы можно было обратиться к объекту COM, необходимо использовать метод
InvokeMember
объекта
Type
, который был создан вначале. При вызове метода
InvokeMember
ему передается ссылка на объект COM вместе с именем вызываемого метода COM, а также массив типа
object
всех входящих аргументов метода.

ObjCustomerTableType.InvokeMember("Delete", BindingFlags.InvokeMethod, null, objCustomerTable, aryInputArgs);

Напомним еще раз последовательность действий:

1. Создать объект

Type
для типа объекта COM с помощью метода класса
Type.GetTypeFromProgID
.

2. Использовать этот объект

Type
для создания объекта COM с помощью
Activator.CreateInstance
.

3. Методы вызываются на объекте COM, вызывая метод

InvokeMember
на объекте
Type
и передавая в него ссылку
object
в качестве входящего аргумента. Ниже приведен пример кода, объединяющий все это в один блок:

using System.Runtime.InteropServices;

Type objCustomerTableType;

object objCustomerTable;

objCustomerTableType=Type.GetTypeFromProgID("DataAccess.CustomerTable");

objCustomerTable=Activator.CreateInstance(ObjCustomerTableType);

objCustomerTableType.InvokeMember("Delete", BindingFlags, InvokeMethod, null, objCustomerTable, aryInputArgs);

objCustomerTableType = Type.GetTypeFromProgID("DataAccess.CustomerTable");

Хотя средства позднего связывания C# позволяют избежать трудностей RCW, необходимо знать о некоторых, связанных с этим, недостатках.

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

InvokeMember
, что может породить ошибку во время выполнения.

Второй: позднее связывание может быть медленным. Каждый раз при использовании

InvokeMember
на объектной ссылке среда времени выполнения должна найти требуемый член в библиотеке функций класса COM. Это приводит к снижению производительности программы.

Третий: написание кода с поздним связыванием может оказаться трудоемким. Так как не требуется ссылаться на библиотеку типов компонента COM, IDE VS.NET не может использовать Intellisense, чтобы помочь с именами членов и списками аргументов, поэтому в коде могут появиться ошибки, которые будет трудно найти до времени выполнения.

Использование элементов управления ActiveX в .NET

Элемент управления ActiveX является частным типом компонента COM, который поддерживает специальное множество интерфейсов для обеспечения графического представления. Также, как можно импортировать стандартные компоненты COM для использования в проектах .NET, можно также импортировать элементы управления ActiveX. Это позволяет сделать утилита

AxImp.exe
.

AxImp.exe

Чтобы импортировать компонент ActiveX в среду .NET, утилита

AxImp.exe
вызывается из командной строки. Команда состоит из двух частей:

1. Имени

AxImp
.

2. Абсолютного или относительного пути доступа к файлу ActiveX (

*.осх
), который должен быть импортирован.

Для примера рассмотрим снимок экрана, приведенный ниже. Здесь импортируется элемент управления ActiveX Win32 MAPI и определяется расположение файла

.осх
(
C:\windows\system\msmapi32.осх
):

  • Читать дальше
  • 1
  • ...
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: