Привет! В данной статье я расскажу, как вы можете создать свой 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:
рис.8
Чуть не забыли добавить в проект расширение SpeechLib для "говорилки", правой кнопкой по проекту Add Reference...
рис.9
Приступим к компиляции, установим Solution Configuration значение Release, далее меню Build->Build Solution и в результате чего в папке проекта bin\Release получим библиотеку *.dll готовую для регистрации в системе как COM-объект.
рис.10
Зарегистрировать в системе библиотеку с помощью утилиты regasm.exe, которая находится по умолчанию в папке "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe". Удобнее это делать через Visual Studio 2008 Command Prompt(можно найти в "Пуске") запускаем а админискими правами, набираем:
c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>regasm "C:\Users\UserName\Documents\Visual Studio 2008\Projects\HowToComObjectFor1C\HowToComObjectFor1C\bin\Release\HowToComObjectFor1C.dll" /codebase
или через CMD
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe "C:\Users\UserName\Documents\Visual Studio 2008\Projects\HowToComObjectFor1C\HowToComObjectFor1C\bin\Release\HowToComObjectFor1C.dll" /codebase
совсем ленивые могут запустить батник RegDLL.bat в приложении к публикации.
Если видим сообщение "Типы успешно зарегистрированы" значит все COM-объект зарегистирован.
Переходим к любимой 1С, создаем новую внешнюю обработку на форме по кнопке выполнить пишем:
Процедура КнопкаВыполнитьНажатие(Кнопка)
МойОбъект = Новый COMОбъект("HowToComObjectFor1C.MyClass");
Сообщить(МойОбъект.PrintIn1C("Hello from Com-object;)"));
МойОбъект.OpenCD(Истина); //открыть CD-ROM, параметр ложь соотвественно закроет его
Сообщить(МойОбъект.GetAllSystemProcess());
МойОбъект.SpeakVoice("My оn Ass Chess Knock Pale Man what can i do Yellow blue bus"); //заставим компьютер говорить по-русски
КонецПроцедуры
Теперь остается запустить обработку увидеть результат и прослушать речь про любовь компьютера к майонезу, чесноку, пельменям и водке:)
Вот и все ребят! Буду рад вашему плюсу к статье.
Все примеры описанные в публикации вы можете найти в архиве в приложении.