gifts2017

Как написать COM-объект для 1С на Visual Studio C# 2008

Опубликовал Михаил Русанов (RainyAugust22) в раздел Программирование - Практика программирования

Расширяем функционал 1С с помощью разработки подключаемого COM-объекта! Пишем код на Visual C# 2008 для открытия CD-ROM'а, получения списка процессов и использования возможностей системы text-to-speech.

Привет! В данной статье я расскажу, как вы можете создать свой COM-объект для 1С с помощью Visual C# 2008.

Для этого на понадобится собственно сам Microsoft Visual Studio 2008 с предустановленным .NET Framework 3.5, 1С Предприятие 8.2 и желание :-)

Начнем с того что запустим Microsoft Visual Studio 2008 от имени администратора, делается это так правой кнопкой по ярлыку(рис.1 ):

рис.1

 

Далее создадим новый проект File->New->Project, выбираем Class Library(рис.2)

рис.2

Студия сформирует шаблон класса следующего содержания:

рис.3

Удаляем все пишем заново код приведенный ниже:

        //1. подключаем необходимые пространства имен
        using System;
        using System.Text;
        using System.Runtime.InteropServices;
        using SpeechLib;

  
        //2. описываем наше пространство имен, собственно так и будет называется наш COM-объект
        namespace HowToComObjectFor1C
        {
        //3. объявляем интерфейс для класса, создаем GUID с помощью утилиты "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\guidgen.exe" поясняю, запускаем утилиту устанавливаем значение на п.4 нажимаем Copy переносим в наш код:

рис.4


        [Guid("6844AACB-9194-46bf-81AF-9DA73EE687DC")]
        internal interface IMyClass
        {
            [DispId(1)]
            //4. описываем методы которые можно будет вызывать из вне
            string PrintIn1C(string mymessage);
            void OpenCD(bool MyParam);
            string GetAllSystemProcess();
            void SpeakVoice(string SpeakText);
        }

        //5. определим интерфейс для COM-событий(GUID получаем и записываем с помощью утилиты guidgen.exe)
        [Guid("70DD7E62-7D82-4301-993C-B7D919430990"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface IMyEvents
        {
        }

        //6. описываем класс реализующий интерфейсы(GUID получаем и записываем с помощью утилиты guidgen.exe)
        [Guid("69EE0677-884A-4eeb-A3BD-D407844C0C70"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IMyEvents))]
        public class MyClass : IMyClass //название нашего класса MyClass
        {
            string StringProcess; //строковая переменная для функции ниже
            [DllImport("winmm.dll")] //подключаем dll для процедуры ниже
            static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
            //простенькая функция которая вернет строку в 1С которую мы также пошлем из 1С, можете написать ей Hello World к примеру
            public string PrintIn1C(string mymessage)   
            {
                return mymessage;
            }
            //процедура для открытия/закрытия CD-ROM'а из 1С ;-)
            public void OpenCD(bool MyParam)
            {
                if (MyParam)
                {
                    mciSendString("set CDAudio door open", null, 0, IntPtr.Zero);
                }
                else
                    mciSendString("set CDAudio door closed", null, 0, IntPtr.Zero);
            }
            //получаем список процессов и передаем 1С
            public string GetAllSystemProcess()
            {
                foreach (System.Diagnostics.Process winProc in System.Diagnostics.Process.GetProcesses())
                {  
                    StringProcess = StringProcess + "\r\n Process " + winProc.Id + ": " + winProc.ProcessName;
                }
                return StringProcess;
            }
            //кое-что поинтересней процедура для вызова "говорящего компьютера" передаем ей текст, а она нам голосом!:)
            public void SpeakVoice(string SpeakText)
            {
                SpVoice voice = new SpVoice();
                voice.Speak(SpeakText, SpeechVoiceSpeakFlags.SVSFDefault);
            }   
        }
        }

 

Теперь когда код написан, нужно в свойствах проекта

рис.5

включить галочку Register for COM interop на закладке Build.

рис.6

Подписать сборку уникальными именем (StrongName). На закладке свойств проекта: Properties - Signing - Sign the Assembly - далее, нужно указать имя файла ключа. Пароль указывать не обязательно. Будет автоматически создан файл *.snk, в данном случае, было указано имя ComObjectFor1C.snk

рис.7

В файле AssemblyInfo.cs нужно указать параметр, содержащий имя файла подписи и параметр ComVisible установить true: