Трассировка и отладка в .NET


Вызываемый упаковщик на основе



Рисунок 15.3. Вызываемый упаковщик на основе модели компонентных объектов Microsoft (COM) (Callable COM Wrapper, CCW) между неуправляемым и управляемым кодами


Библиотека типов может быть сгенерирована с помощью утилиты Tlbexp.exe (Assembly to Type Library Converter — Конвертер сборки в библиотеку типов) из метаданных в сборке .NET. Это позволяет клиентам на основе модели компонентных объектов Microsoft (СОМ) просматривать компоненты .NET так, как будто они являются обычными компонентами, построенными на основе модели компонентных объектов Microsoft (COM). Утилита Tlbexp. exe (Assembly to Type Library Converter — Конвертер сборки в библиотеку типов) является дополняющей сервисной программой к утилите Tlbimp. exe, описанной в предыдущем разделе этой главы. Традиционный клиент на основе модели компонентных объектов Microsoft (COM) может использовать информацию в полученной библиотеке типов для доступа к компонентам .NET, применяя раннее связывание. Ниже приведен синтаксис для вызова утилиты командной строки Tlbexp. exe (Assembly to Type Library Converter — Конвертер сборки в библиотеку типов):

Tlbexp AssemblyName [options]
Where options may be composed of the following:
/out:FileName Output typelib file name
/nologo Prevents displaying logo
/silent Prevents displaying messages
/verbose Displays extra information
/? or /help Display usage help message

Вот более русифицированный вариант этой выдачи:

Tlbexp AssemblyName [параметры]
Где параметры могут быть составлены из следующего:
/out:FileName Имя файла выходной библиотеки типов


/nologo Подавляет вывод протокола
/ silent (тихий) Подавляет отображение сообщений
/ verbose (подробная) Дополнительная информация
/? или /help (помощь) Вывести сообщение - справку по использованию

Утилита Tlbexp. exe (Assembly to Type Library Converter — Конвертер сборки в библиотеку типов) является хорошим средством генерации полезной информации библиотеки типов для сборки .NET. Однако клиентам на основе модели компонентных объектов Microsoft (COM) необходима также запись информации в системный реестр для того, чтобы среда модели компонентных объектов Microsoft (COM) могла найти нужную фабрику классов, путь к серверу, и т.п. Утилита регистрации сборки Regasm. exe (Assembly Registration Utility) прочитывает метаданные в сборке и добавляет необходимые записи в системный реестр, что позволяет клиентам на основе модели компонентных объектов Microsoft (COM) использовать компоненты сборки .NET так, как будто они являются обычными зарегистрированными компонентами, построенными на основе модели компонентных объектов Microsoft (COM). Конечно, клиенты при этом используют заместитель — вызываемый упаковщик на основе модели компонентных объектов Microsoft (COM) (Callable COM Wrapper, CCW).
Синтаксис вызова утилиты регистрации сборки Regasm.exe приведен ниже. Эта утилита позволяет программам клиентов на основе модели компонентных объектов Microsoft (СОМ) создавать экземпляры управляемых классов, определенных в сборке.

Regasm AssemblyPath [options]
Where the options may be any of the following,
/unregister Unregister types
/tlb[:FileName] Specified typelib
/regfile[:FileName] Specified output reg file name
/codebase Sets the code base in the registry
/registered Only refer to preregistered typelibs
/nologo Prevents displaying logo
/silent Prevents displaying of messages
/verbose Displays extra information
/? or /help Display usage help message

Вот более русифицированный вариант этой выдачи:

Regasm AssemblyPath [параметры]
Где параметры могут быть любыми из следующих.
/unregister Отменить регистрацию типов
/tlb[:FileName] Указанный файл библиотеки типов
/regfile[:FileName] Указанное имя выходного файла
/codebase (кодовая страница) Устанавливает кодовую страницу
в системном реестре
/registered (зарегистрированный) Обращаться только к предварительно
зарегистрированным библиотекам
типов
/nologo Предотвращает вывод протокола
/silent (тихий) Предотвращает отображение сообщений
/verbose (подробно) Выводит дополнительную информацию
/? или /help (помощь) Вывести сообщение - справку
по использованию

Теперь давайте воспользуемся утилитами 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
Ранне-связанные клиенты на основе модели компонентных объектов Microsoft (СОМ) могут использовать данный файл SomeManagedClass .tlb во время компиляции Например, следующая консольная клиентская программа Win32 на основе модели компонентных объектов Microsoft (COM) с именем COMClientOfManagedClass (которая была создана с помощью VC++ 6 О для имитации существующего клиента на основе модели компонентных объектов Microsoft (COM)) использует раннее связывание для вызова компонентов NET в ранее описанной сборке SomeManagedClass.dll



Содержание раздела