Алексей Алексеев Добро пожаловать в мой уютненький бложек

Создание и регистрация COM-объекта из NET-сборки

Сделать NET-сборку видимой как COM-объект большого труда не составляет, однако есть несколько не очевидных моментов,которые могут отнять достаточное количество времени.

Сразу стоит заметить,что для интересующихся данной темой подробно и строго следует порекомендовать книгу  А Дубовцева "Microsoft.NET Наиболее полное руководство", в которой подробно изложен данный процесс, а также другие весьма полезные вещи. В данной же процесс будет описан вкратце.

Итак, начать следует с создания библиотеки классов.  На приведенном ниже рисунке показано создание библиотеки классов в  MS VS 2008 на языке C#

После в проекте можно создавать любые классы, реализующие необходимую логику. Однако же  для корректного отображения в пространстве COM-объектов необходимо назначить каждому классу  атрибуты. Перечислим их:

[ComVisible(true), ProgId("ПространствоИмен.ИмяКласса"), Guid("УникальныйИдентификатор"), ClassInterface(ClassInterfaceType.AutoDispatch)]

Так же желательно подписать всю сборку строгим именем (по той причине, что она помещается в GAC в обязательном порядке), сделать это можно с помощью атрибута

[assembly: AssemblyKeyFile("ИмяФайлаПарыКлючей.snk")]

Естественно, пара ключей должна быть создана предварительно.

Стоит отметить, что файл манифеста так же должен содержать атрибут

ComVisible(true) примерно в таком виде:

// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми
// для COM-компонентов.  Если требуется обратиться к типу в этой сборке через
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
[assembly: ComVisible(true)]

Стоит напомнить, что все экспортируемые классы должны содержать конструктор по умолчанию. Если у класса такового не будет,  как  COM-объект он не  зарегистрируется!

Опишем процесс регистрации. Вообще говоря существуют разные пути,  зарегистрировать сборку как СОМ-объект, здесь опишем простейший. Создадим bat-файл следующего содержания:

 @ECHO OFF

REM The following directory is for .NET 4.0
set DOTNETFX4=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
set PATH=%PATH%;%DOTNETFX4%

echo ---------------------------------------------------
regasm.exe ИмяБиблиотеки.dll /codebase
ngen.exe ИмяБиблиотеки.dll
echo ---------------------------------------------------
echo Done.

Проверить, зарегистрированы ли классы сборки в качестве  COM-объектов можно с помощью поиска соответствующих записей в реестре или с помощью утилиты oleview.exe, как это показано ниже

Сборка с именем nlbrd  в реестре, показана запись для клаксса BRIDGE.

То же самое но в oleview.exe

Если все указанные пункты выполнены верно, NET-сборка теперь будет одновременно и СОМ-объектом.

Автор: Тимофеев Александр