COM сервер на C# для 1С 8.3

Что такое COM

COM (Component Object Model) — это модель компонентного объекта. С помощью COM-технологии можно разрабатывать независимые программные модули. Данные модули используют определенный двоичный стандарт, что означает независимость от языка программирования.

Простыми словами COM сервер (или COM компонент) — это некая библиотека, у которой есть открытый программный интерфейс, через который можно взаимодействовать с ней. COM это подход, с помощью которого одна программа предоставляет определенные сервисы другим программам, причем они могут быть разработаны с помощью разных языков программирования.

COM сервер может быть как dll файлом (внутризадачный сервер), так и exe файлом (локальный сервер). COM сервер в виде dll выполняется в процессе клиента, который вызвал его. COM сервер в виде exe создается как отдельный процесс. Пример COM сервера в виде exe файла — Microsoft Word.

Сведения о COM сервере регистрируются в реестре Windows. Основные сведения, которые содержатся в реестре это CLSID, ProgID и путь к dll файлу. CLSID однозначно идентифицирует каждый COM сервер, а ProgID позволяет использовать понятное строковое представление при вызове COM сервера.

Простой COM сервер на C#

COM сервер будем разрабатывать на языке программирования C# в Visual Studio Community 2019, которую можно скачать по данной ссылке:

Visual Studio

Во время установки нужно отметить флажком Кроссплатформенная разработка .Net Core:

Visual Studio

После установки создадим новый проект и выберем тип Библиотека классов (.Net Framework). Платформу можно выбрать ту, которая у вас установлена, я разрабатывал на платформе .Net Framework 4.7.

Библиотека классов (.Net Framework)

Укажем имя проекта COMFor1C, путь к каталогу с файлами проекта и нажмем Создать.

Удалим весь код, который был создан по умолчанию и вставим такой код:

Здесь мы подключили нужные нам пространства имен и создали свой класс TestCOM, в котором будет заключена основная функциональность.

Теперь нужно добавить 2 интерфейса, которые будут доступны для COM:

Интерфейс ITestCOM будет использоваться для методов, доступных через COM. Интерфейс ITestCOMEvents для событий.

Чтобы к интерфейсам и классам был доступ через COM нужно добавить атрибут [ComVisible(true)]:

Так как мы создали свой интерфейс, то нужно для класса указать атрибут [ClassInterface(ClassInterfaceType.None)], чтобы автоматически не создавался еще один интерфейс для COM:

Для интерфейса событий нужно указать, что это IDispatch с помощью атрибута [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]:

А также применим интерфейс ITestCOM для нашего класса и укажем, что интерфейс ITestCOMEvents является источником событий с помощью атрибута [ComSourceInterfaces(typeof(ITestCOMEvents))]:

Теперь для каждого типа данных нужно создать GUID. Для этого выберем пункт меню Средства -> Создать GUID:

Создать GUID

В открывшемся окне выберем пятый пункт и нажмем Создать GUID. Затем нажмем Копировать и вставим GUID для класса. Те же самые действия проделаем для интерфейсов:

Создать GUID

В итоге получится некий шаблон для создания COM сервера:

Добавим в интерфейс и класс метод HelloCOM, который вернет строку «Hello, COM»:

Теперь подпишем сборку. Для этого в обозревателе решений щелкнем правой кнопкой по проекту и выберем Свойства. Перейдем на закладку Подписывание и установим флаг Подписать сборку:

Подписать сборку

В поле «Выберите файл ключа строгого имени» выберем Создать. Создадим новый ключ с именем COMFor1C, пароль устанавливать не будем:

Подписать сборку

В обозревателе решений в группе Properties откроем файл AssemblyInfo.cs и добавим туда информацию о файле с ключом:

сразу после строки

Должно получиться так:

Установим конфигурацию Release и выберем пункт меню Сборка -> Собрать решение:

Сборка

Внизу должна появиться информация об успешной сборке.

Перейдем в папку с проектом, зайдем в папку bin\Release и там мы найдем файл COMFor1C.dll, который и является COM сервером.

Регистрация COM сервера

Если сейчас в 1С попробовать создать COM объект:

То выйдет ошибка «-2147221005(0x800401F3): Недопустимая строка с указанием класса». Так произошло, потому что COM сервер еще не зарегистрирован в реестре.

Для регистрации сборок с управляемым кодом используется утилита regasm.exe. Регистрацию будем выполнять через командную строку. Для этого нужно запустить ее от имени администратора и выполнить следующую команду:

После этого мы попадем в каталог, где находится утилита regasm.exe. Непосредственно регистрация выполняется командой:

Вместо «F:\COMFor1C\bin\Release\COMFor1C.dll» укажите ваш путь до dll файла. Можно перенести dll в папку с базой 1С и зарегистрировать оттуда.

Если регистрация прошла успешно, то должно появиться сообщение «Типы зарегистрированы успешно».

Чтобы COM сервер работал в 64-х разрядной платформе 1С нужно отдельно зарегистрировать для 64-х разрядного .Net Framework. Для этого нужно в командной строке перейти в каталог:

И уже из этого каталога выполнить регистрацию того же самого dll файла:

Использование COM сервера в 1С

Наконец проверим как работает COM сервер в 1С. Для этого создадим простую обработку с одной командой и добавим в нее следующий код:

В результате на экран будет выведено сообщение «Hello, COM».

Исходники на C# и обработку для тестирования можно скачать тут.

Понравилась статья? Поделиться с друзьями:
Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok