Исходники к статье - Sourcе.zip (3K)
Использование компонентов COM при помощи .NET, является, вообщем-то, задачей тривиальной. Основной проблемой является то, что COM хранит информацию о типах в библиотеках типов (tlb),а .NET хранит её в метаданных внутри сборок. Для того чтобы использовать некоторый компонент COM, нам предстоит создать для него сборку с метаданными, описывающими типы данного компонента. Для этого мы воспользуемся утилитой Tlbimp.exe, которая позволяет создавать сборки с описаниями типов из обычных компонентов COM. Для этой статьи я выбрал весьма интересный компонент, который располагается в библиотеке Shell32.dll в системной директории Windows. Вы, наверное, узнали библиотеку, в которой расположены сервисы оболочки Windows. Эта библиотека предоставляет несколько интерфейсов, которые позволяют управлять оболочкой. Ими-то мы с вами и воспользуемся. Для начала "достанем" описания типов из этой библиотеки и поместим их в сборку. А сделаем мы это так:
tlbimp.exe Shell32.dll /out:Shell32.dll |
Теперь у нас есть сборка, которую мы будем использовать для взаимодействия с компонентом. Взгляните на код, который будет вызывать COM-компонент.
'File: Some.vb 'Author: Copyright (C) 2001 Dubovcev Aleksey Imports System Imports Shell32 Public Class App Public Shared Sub Main() Dim sh As Shell 'Создаём COM-объект sh = new Shell() 'Используем данный объект sh.FileRun() End Sub End Class |
/* File: Some.cs Author: Copyright (C) 2001 Dubovcev Aleksey */ using System; using Shell32; public class Application { public static void Main() { //Создаём COM-объект Shell shell = new Shell(); //Используем данный объект shell.FileRun(); } } |
/* File: Some.cpp Author: Copyright (C) 2001 Dubovcev Aleksey */ #using <mscorlib.dll> using namespace System; using namespace Shell32; void main() { Shell* shell; //Создаём COM-объект shell = new Shell(); //Используем данный объект shell->FileRun(); } |
/* File: Some.il Author: Copyright (C) 2001 Dubovcev Aleksey */ .assembly Some {} .assembly extern mscorlib {} .assembly extern Shell32 {} .method public static void Main() cil managed { .entrypoint .maxstack 1 //Обратите внимание на то, что я не сохраняю значение //созданного нами объекта, так как оно понадобиться нам всего лишь один раз. //Поэтому не имеет смысла занимать лишнее место в стеке. //Ниже я написал код, который генерирует компилятор C#. //Создаём COM-объект newobj instance void [Shell32]Shell32.Shell::.ctor() //Используем данный объект callvirt instance void [Shell32]Shell32.Shell::FileRun() ret //Это то, что генерирует C#, до идеала, на мой взгляд, далековато. // .locals (class [Shell32]Shell32.Shell V_0) // newobj instance void [Shell32]Shell32.Shell::.ctor() // stloc.0 // ldloc.0 // 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-интерфейса, что является далеко не простой задачей. Как это сделать, читайте в следующей статье.