Привет! В данной статье я расскажу, как вы можете создать свой 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.