C# + 1C. Пишем простейший COM-сервер для 1С
Изучение возможности интеграции C# и 1С мы начнем с создания на C# простейшего COM сервера. Для этой цели нам понабиться Visual Studio 2010 и платформа 1C 8.2. И так, в визуал студии создаем новый проект, тип проекта выбираем «библиотека классов» (class library):
У нас появится заготовка библиотеки, куда мы введем вот такой текст (вместо существующего):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; namespace MyComFor1C { [Guid("2A44957D-A704-4370-9C4B-5D6EE147ABB6")] internal interface IMyClass { [DispId(1)] void message(string msg); } [Guid("CC441039-F00D-4617-B2AD-36082B7D4D9D"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IMyEvents { } [Guid("E60248B4-F573-4EAE-93E9-5E77341D05BA"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IMyEvents))] public class MyClass : IMyClass { public void message(string msg) { MessageBox.Show(msg,"Это сообщение COM",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); } } }
Обратите внимание, что в юзинги мы добавили System.Windows.Forms, поэтому необходимо подключить к библиотеке соответствующую ссылку:
Сделать это можно либо кликнув на ветке «Ссылки» правой кнопочкой мыши:
либо через меню «Проект» —> «Добавить ссылку»:
Теперь обратите внимание на гуиды (текст типа CC441039-F00D-4617-B2AD-36082B7D4D9D). Их надо будет сгенерить. Для этого запускаем специальную утилиту «Генератор GUID», которая входит в стандартный пакет Visual Studio:
Для генерации выбираем формат, в котором надо генерить, нажимаем «Создать GUID» а потом «Копировать», что бы поместить его в буфер обмена, а потом вставить в текст программы:
Вставив в программу приведенный здесь код, а в код свои гуиды, займемся настройкой проекта:
Во-первых, на закладке «Построение» надо указать, что наша программа будет зарегистрирована для COM-взаимодействия:
Во-вторых, надо создать подпись на сборку (пароль создавать необязательно):
Ну, и последний штрих, идем в AssemblyInfo.cs и вставляем туда вызов AssemblyKeyFile, а ComVisible делаем true:
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Управление общими сведениями о сборке осуществляется с помощью // набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, // связанные со сборкой. [assembly: AssemblyTitle("ClassLibrary1")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ClassLibrary1")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Параметр ComVisible со значением FALSE делает типы в сборке невидимыми // для COM-компонентов. Если требуется обратиться к типу в этой сборке через // COM, задайте атрибуту ComVisible значение TRUE для этого типа. [assembly: ComVisible(true)] [assembly: AssemblyKeyFile("MyComFor1C.snk")] ... ...
Все, компилим проект а затем регистрируем его утилитой RegAsm:
Можно нашу компоненту не регить предварительно, а хранить в виде двоичных данных и регать перед первым использованием.
Все, теперь протестим что мы написали. И так, создаем обработину:
Процедура КнопкаВыполнитьНажатие(Кнопка) МойОбъект = Новый COMОбъект("MyComFor1C.MyClass"); МойОбъект.message("Проба. Это такое пробное сообщение"); КонецПроцедуры
Запустив эту обработку, мы увидим, что наш COM-объект действительно работает
Comments
So empty here ... leave a comment!