Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Все статьи »

Обсудить на форуме Обсудить на форуме

Использование COMпонентов при помощи .NET
Использование компонентов COM при помощи .NET, является, вообщем-то, задачей тривиальной. Основной проблемой является то, что COM хранит информацию о типах в библиотеках типов (tlb),а .NET хранит её в метаданных внутри сборок. Для того чтобы использовать некоторый компонент COM, нам предстоит создать для него сборку с метаданными, описывающими типы данного компонента...
Исходники к статье - 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
    '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
    
  • C#
    /*
    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();
    
      }
    }
    
  • Managed Extensions for C++
    /*
    File:   Some.cpp
    Author: Copyright (C) 2001 Dubovcev Aleksey
    */
    
    #using 
    
    using namespace System;
    using namespace Shell32;
    
    void main()
    {
      Shell* shell;
      //Создаём COM-объект
      shell = new Shell();
      //Используем данный объект
      shell->FileRun();
    }
    
  • Microsoft Intermediate Language
    /*
    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-интерфейса, что является далеко не простой задачей. Как это сделать, читайте в следующей статье.


Может пригодится:


Автор: Алексей Дубовцев
Прочитано: 2556
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру