Исходники
к статье - Sourcе.zip (3K)
Использование компонентов COM при помощи .NET, является, вообщем-то,
задачей тривиальной. Основной проблемой является то, что COM хранит
информацию о типах в библиотеках типов (tlb),а .NET хранит её в
метаданных внутри сборок. Для того чтобы использовать некоторый
компонент COM, нам предстоит создать для него сборку с метаданными,
описывающими типы данного компонента. Для этого мы воспользуемся
утилитой Tlbimp.exe, которая позволяет создавать сборки с
описаниями типов из обычных компонентов COM. Для этой статьи я выбрал
весьма интересный компонент, который располагается в библиотеке
Shell32.dll в системной директории Windows. Вы, наверное, узнали
библиотеку, в которой расположены сервисы оболочки Windows. Эта
библиотека предоставляет несколько интерфейсов, которые позволяют
управлять оболочкой. Ими-то мы с вами и воспользуемся. Для начала
"достанем" описания типов из этой библиотеки и поместим их в сборку. А
сделаем мы это так:
tlbimp.exe Shell32.dll /out:Shell32.dll
|
Теперь у нас есть сборка, которую мы будем использовать для
взаимодействия с компонентом. Взгляните на код, который будет вызывать
COM-компонент.
- Visual Basic.NET
Imports System
Imports Shell32
Public Class App
Public Shared Sub Main()
Dim sh As Shell
sh = new Shell()
sh.FileRun()
End Sub
End Class
|
- C#
using System;
using Shell32;
public class Application
{
public static void Main()
{
Shell shell = new Shell();
shell.FileRun();
}
}
|
- Managed Extensions for C++
#using
using namespace System;
using namespace Shell32;
void main()
{
Shell* shell;
shell = new Shell();
shell->FileRun();
}
|
- Microsoft Intermediate Language
.assembly Some
{}
.assembly extern mscorlib
{}
.assembly extern Shell32
{}
.method public static void Main() cil managed
{
.entrypoint
.maxstack 1
newobj instance void [Shell32]Shell32.Shell::.ctor()
callvirt instance void [Shell32]Shell32.Shell::FileRun()
ret
}
|
ПРИМЕЧАНИЕ
Для языка IL сборка подключается не из командной строки, а при
помощи модификатора extren для ключевого слова
.assembly. (То есть: .assembly extern
Shell32)
|
Видите, как все просто. Надо только не забыть сделать ссылку на
сборку, в которой храниться описание нашего с вами компонента (Shell32).
Если вы используете IDE, то вам необходимо выбрать пункт меню
Project->AddReference... (рис. 1) или щелкнуть правой кнопкой
мыши в SolutionExplorer на вашем проекте, выбрать пункт
AddReference... (рис. 2) и добавить ссылку на сборку.
Рис 1
Рис 2
Директивой using мы подключаем пространство имен
компонента, после чего мы можем использовать любой класс, находящийся
внутри него, как обычный класс .NET. В примере я выбрал класс Shell, это
один из достаточно интересных классов, предоставляемых оболочкой. Вы
можете изучить его, используя Platform SDK или команду
View->Otherwindows->ObjectsBrowser. Я вызываю функцию, действие
которой эквивалентно выбору пункта меню Start->Run оболочки
Windows.
В этой статье я показал вам, как легко можно использовать компоненты
COM из среды .NET. Но это работает лишь в случае полного
благоприятствования, то есть когда у нас есть библиотека типов
компонента и когда сам компонент правильно написан. В ином случае нам
придется самостоятельно написать заглушку для COM-интерфейса, что
является далеко не простой задачей. Как это сделать, читайте в следующей
статье.