Architecture Net или что такое Microsoft.NET?




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

Ранне-связываемые клиенты на основе модели компонентных объектов Microsoft (СОМ) обычно используют информацию библиотеки типов для доступа к компонентам на основе модели компонентных объектов Microsoft (COM). Такая информация представляет собой удобный способ создания экземпляров классов на основе модели компонентных объектов Microsoft (COM), определенных в этих компонентах, созданных на основе модели компонентных объектов Microsoft (COM). Информация а библиотеках может храниться в файлах TLB, динамически подключаемых библиотеках (DLL), специализированных управляющих элементах OLE (OCX) и исполняемых файлах, однако только файлы TLB специально предназначены именно для этой цели.

3.gif

Рис. 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

4.gif

Рис 15 4 Утилита Oleview exe показывает содержимое библиотеки типов, построенной на основе модели компонентных объектов Microsoft (COM) Библиотека типов была сгенерирована из сборки NET с помощью утилиты Tlbexp. exe (Assembly to Type Library Converter — Конвертер сборки в библиотеку типов)

//COMClientOfManagedClass cpp
ttinclude <iostream h>
#include <objbase.h>
Iimport "C \WINNT\Microsoft NET\Framework\vl.0.2914\
mscorlib.tlb"
ttimport "..\SomeManagedClass\Debug\SomeManagedClass.tlb"
no_namespace named_guids
void main()
{
{
// вложенные фигурные скобки предотвращают
// исключение указателя (pointer exception)'
CoInitialize(NULL); // ПУСТОЙ УКАЗАТЕЛЬ
_ManagedClassPtr psc(CLSID_ManagedClass);
int i = psc->AddEmUp(3, 4);
cout « i « endl « flush;
}
CoUninitialize ();
}

Однако компоненты NET будут недоступны для приложений клиентов, построенных на основе модели компонентных объектов Microsoft (COM), пока требуемые элементы не будут внесены в системный реестр и сборка не станет доступной для загрузчика классов общеязыковой среды выполнения CLR (либо локально, либо в глобальном кэше сборки) Для регистрации используется утилита регистрации сборки Regasm.exe (Assembly Registration Utility). Она читает метаданные в сборке компонентов .NET и создает соответствующие записи в системном реестре. Это позволяет любому клиенту на основе модели компонентных объектов Microsoft (COM) получать доступ к компонентам .NET так, как будто это обычные компоненты, построенные на основе модели компонентных объектов Microsoft (COM).
Например, для регистрации вышеуказанного компонента .NET как компонента на основе модели компонентных объектов Microsoft (COM) используйте следующую команду:

Regasm SomeMenagedClass.dll

Затем можно использовать утилиту Regedt32 . exe для проверки того, что информация была корректно занесена в системный реестр, что и показано на рис. 15.5.
Как только закончена регистрация сборки SomeManagedClass. dll в качестве компонента на основе модели компонентных объектов Microsoft (COM), следует инсталлировать сборку. Можно, конечно, все выполнить, просто скопировав сборку SomeManagedClass.dll в папку клиента COMClientOfManagedClass. Сделав это, можно, наконец, выполнить клиент COMClientOfManagedClass, построенный на основе модели компонентных объектов Microsoft (COM). После запуска этого клиента, как и ожидалось, будет выведено число.

5.gif

Рис. 15.5. Утилита Regedt32.exe показывает содержимое системного реестра для идентификатора класса для сборки .NET, которая была зарегистрирована как компонент, построенный на основе модели компонентных объектов Microsoft (COM)