Использование компонентов .NET в COM

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

RegAsm.exe

Применение компонентов COM в коде .NET требует другой утилиты, которая существует в SDK .NET, являющейся аналогом программы импорта библиотеки типов, которую мы видели ранее. Название этой утилиты — RegAsm.exe.

Название утилиты RegAsm (Register Assembly) обозначает ее функцию, она отвечает за ввод информации о типе компонента .NET в системный реестр, чтобы службы COM могли к нему обратиться. После регистрации компонента .NET с помощью RegAsm, стандартные клиенты Windows могут сделать позднее соединение с классами компонента. Процесс регистрации компонента должен быть сделан только один раз. После регистрации все клиенты COM могут к нему обращаться.

В качестве примера рассмотрим следующий код. Он принадлежит классу в библиотеке классов .NET. Функция получает просто число в качестве аргумента ввода и возвращает факториал этого числа:

namespace Factorial {

 using System;

 public class Factorial {

  // Этот метод вычисляет факториал числа

  public int ComputeFactorial(int n) {

   int intFactorial=n;

   for (int i = 1; i<n; i++) {

   intFactorial*=i;

  }

  return intFactorial;

 }

 }

}

После компиляции класса примера в сборку .NET можно зарегистрировать эту сборку в службах COM с помощью RegAsm.exe:

Теперь, когда сборка зарегистрирована в службах COM с помощью RegAsm, можно выполнить позднее связывание со сборкой .NET через службы COM. С целью демонстрации создадим простой сценарий VB, который это делает. (Сценарий VB можно создать с помощью текстового редактора, такого как Notepad; введите просто следующий код и сохраните файл с расширением .vbs. Предполагая, что Windows Script Host установлен, файл при вызове будет выполняться как сценарий. Помните, что сценарий VB выполняет позднее связывание для компонентов COM.)

Option Explicit

Dim objFactorial

Dim lngResult

Dim lngInputValue

Set objFactorial=CreateObject('Factorial.Factorial')

lngInputValue=InputBox('Numbers?')

IngResult=objFactorial.ComputeFactorial(CLng(lngInputValue))

Call MsgBox(lngResult)

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

sn -k Factorial.dll

Далее необходимо создать файл AssemblyInfo.cs со следующим содержимым:

using System.Reflection;

[assembly: AssemblyKeyFile('factorial.snk')]

Затем это надо откомпилировать с помощью следующей команды, чтобы превратить в модуль:

CSC /t:module /out: AssemblyInfo.dll AssemblyInfo.cs

После этого компилируется файл Factorial.cs, и полученная DLL устанавливается в глобальный кэш с помощью gacutil следующим образом:

csc /t:library /addmodule:assemblyinfо.dll Factorial.cs gacutil /i Factorial.dll

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

Интересная техника, не правда ли? Но она не решает ни одной из упомянутых выше проблем, связанных с поздним связыванием. К счастью, другой член набора инструментов SDK .NET может в этом помочь. Это утилита TlbExp.exe.

Однако, прежде чем попрощаться с TlbImp.exe, необходимо запомнить одну вещь: службы COM должны иметь возможность найти компонент сборки .NET, когда он вызывается. Это означает, что сборка должна располагаться в рабочей папке клиента или в глобальном коде сборки системы.

TlbExp.exe

TlbExp обозначает Type Library Exporter (экспортер библиотеки типов). При выполнении на файле сборки .NET TlbExp может запросить внутренний манифест этой сборки и вывести соответствующий файл библиотеки типов COM (*.tlb). Когда TlbExp создаст файл библиотеки типов для компонента .NET, языки разработки не принадлежащие .NET, такие как VB6, смогут ссылаться на него, используя для того, чтобы получить эффективное раннее связывание с компонентами .NET:

Как можно было уже догадаться, утилиты TlbExp и RegAsm были созданы для работы в тесном взаимодействии. RegAsm используется для регистрации компонента .NET в службах COM, а затем TlbExp — для экспорта библиотеки типов COM клиенту и ссылки на нее из языков не принадлежащих .NET.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату