Иллюстрированный самоучитель по Architecture .NET

Раннее связывание клиента на основе модели компонентных объектов Microsoft (COM) с компонентами .NET

Теперь давайте воспользуемся утилитами Tlbexp.exe (Assembly to Type Library Converter – Конвертер сборки в библиотеку типов) и Regasm.exe (Assembly Registration Utility – Утилита регистрации сборки) в реальном примере. Рассмотрим следующий код библиотеки классов на управляемом C++ в папке SomeManagedClass. Утилита Tlbexp.exe (Assembly to Type Library Converter – Конвертер сборки в библиотеку типов) откроет для модели компонентных объектов Microsoft (COM) только управляемые общедоступные (public) типы. Именно поэтому класс ManagedClass объявлен как public _gc (общедоступный со сборкой мусора).

Кроме того, без общедоступного конструктора по умолчанию (т.е. не имеющего параметров) клиенты на основе модели компонентных объектов Microsoft (COM) не могут создавать типы при вызове CoCreatelnstance или CoCreatelnstanceEx. Таким образом, в нижеприведенном тексте класс ManagedClass имеет общедоступный конструктор по умолчанию.

Вы можете вспомнить из собственного опыта программирования, что клиент на основе модели компонентных объектов Microsoft (COM) никогда непосредственно не ссылается на СОМ-класс, а вместо этого имеет дело только с интерфейсом класса. Однако по приведенному ниже тексту нельзя сказать, что он реализует какой-либо интерфейс. Значение AutoDual (Автодуальный), которое задано в атрибуте Classlnterface (ClassInterfaceType:: AutoDual), автоматически генерирует дуальный (двойственный) интерфейс для доступа к классу ManagedClass. Это очень удобно, хотя и несколько необычно, так как не существует способа задать версию интерфейса, генерируемого со значением AutoDual (Автодуальный). Позднее мы укажем альтернативный AutoDual (Автодуальному) вариант, в котором можно будет иметь версии, но потребуется непосредственно определить по крайней мере один интерфейс.

//SomeManagedClass.срр
fusing <mscorlib.dll>
using namespace System;
// использовать пространство имен Система;
using namespace System.:Runtime::InteropServices;
// использовать пространство имен
// Система::Время выполнения: InteropServices;
namespace SomeManagedClass
// пространство имен SomeManagedClass
{
[Classlnterfасе(ClassInterfaceType::AutoDual)] // Автодуальный
public _gc class ManagedClass
// класс сборщика мусора ManagedClass
{
public:
ManagedClass () // общедоступный конструктор по умолчанию
{
}
int AddEmUpdnt i, int 3)
{
return i + j;
}
},
}

В результате компиляции вышеописанной программы как проекта библиотеки классов на управляемом C++ (managed C++ Class Library) будет создана сборка – динамически подключаемая библиотека (DLL) – файл с именем SomeManagedClass.dll Следующая команда создаст из этой сборки библиотеку типов с именем SomeManagedClass.tlb:

tlbexp SomeManagedClass.dll

Можно просмотреть содержимое этого файла библиотеки типов, используя сервисную программу для просмотра объектов OLE/COM – утилиту Oleview.exe, расположенную в папке утилит SDK среды .NET. Это показано на рис. 15.4.

Иллюстрированный самоучитель по Architecture .NET › Смешивание управляемого и неуправляемого кода › Раннее связывание клиента на основе модели компонентных объектов Microsoft (COM) с компонентами .NET
Рис. 15.4. Утилита Oleview exe показывает содержимое библиотеки типов, построенной на основе модели компонентных объектов Microsoft (COM). Библиотека типов была сгенерирована из сборки .NET с помощью утилиты Tlbexp.exe (Assembly to Type Library Converter – Конвертер сборки в библиотеку типов)

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.