Связь NET-COM
Для того чтобы использовать визуальный .COM-класс (ActiveX-компонент) в .NET мы просто ставим в .NET-проекте ссылку на .COM-библиотеку, после чего ActiveX можно напрямую использовать в .NET. В некоторых случаях также приходится самому утилитой TLBIMP изготовавливать обертку (муляж) .COM-класса и ссылку в .NET проекте ставить уже на нее.
Обратная задача может быть решена как создание невизуального .COM-компонента на .NET или как создание полноценного визуального ActiveX .COM-компонента на .NET. Первую задачу можно решить либо самостоятельно (описав интерфейсы с особым атрибутом InterfaceTypeAttribute) либо доверится автоматике, самостоятельно создающей описание интерфейсов. Работает нормально и в том и в другом случае.
1.Создание простейшего невизуального COM-компонента на .NET с самостоятельным описанием интерфейсов.
- Делаем простейшую прогу, состоящую из декларации интерфейсов и их реализации. При описании даем интерфейсам атрибут InterfaceTypeAttribute - ComInterfaceType. Единственное, что обязательно в этой проге (помимо собственно реализации интерфейсов) - коструктор класса.
- После создания сборки утилитой TLBEXP создаем .COM-обертку И проверяем, что класс зарегистрировался.
- В проге на VB6 ставим сcылку на обертку нашей .NET сборки. Для такого решения сбока должна находится в каталоге .COM-приложения. Иначе сборку придется добавить в GAC.
- Для этого изготавливаем ключи шифрования и добавляем сбоку в GAC. Проверяем, что она там. И опять же в проекте VB6 просто ставим ссылку на созданную обертку. Естественно все работает. При этом VB6 настолько хорошо принимает созданную нами обманку, что даже раскрывает подсказку.
2.Вместо самостоятельного описания интерфейсов .COM-класса и указания к ним атрибутов InterfaceTypeAttribute можно использовать атрибут ComClass. Студия даже сама умеет выполнять функцию TLBEXP. В итоге все работает точно так же и тоже с подсказкой.
Мы создали настолько нормальный .COM-обьект, что он работает даже в VBSCRIPT или по OACreate в среде SQL-сервера или даже в DHTML. Кроме того, созданную сборку мы можем беспрепятственно использовать и в .NET-среде. Полностью работающий тестовый проект по второму варианту можно сгрузить отсюда. Учтите, что с .NET часто бывают ошибки вот такого плана. Если посмотреть, то действительно одновременно загружено несколько версий .NET - такая ошибка обычно легко исправляется мастером.
Интересно, что атрибута <ComClass()> хватает даже для того, чтобы конструктор MSI-файла студии правильно зарегистрировал созданный TLB-файл в реестре, так что даже для при инсталляции такого приложения напрягатся не приходится.
Для создания визуального ActiveX COM-компонента надо реализовать еще ряд дополнительных интерфейсов, которые будут поддерживать работу контейнера, где лежит ActiveX-компонент как минимум - IOleClientSite, IOleInPlaceSite, IOleInPlaceFrame, и IOleContainer - теоретически я представляю себе как это сделать, но практически этого пока выполнять не приходилось...
Если у кого-то есть время этим занятся - а это было бы просто чудесно - сделать интергированную среду VB6-VB7, в которой можно не задумываясь применять шестерочные и семерочные контролы, которые мирно будут уживатся рядом на одном ToolBox'е - то для этого придется сначала посмотреть описание этих интерфейсов в MSDN и еще можно посмотреть найденный мною в инете пример реализации ActiveX-компонента на C#.
Дополнительная информация:
- Introduction to ActiveX Controls
- Все новости корпорации Майкрософт для разработчиков на .NET
- Team Developer и .NET
- Exposing COM interfaces of a .NET class library for Late Binding
- Использование .NET компонентов при помощи COM
<SITEMAP> <MVC> <ASP> <NET> <DATA> <KIOSK> <FLEX> <SQL> <NOTES> <LINUX> <MONO> <FREEWARE> <DOCS> <ENG> <CHAT ME> <ABOUT ME> < THANKS ME> |