Добрый день, коллеги!
поделитесь пожалуйста примером на С# простейшего обработчика реализующего COM-интерфейс обработчика серверного события.
в документации "Серверные события.chm" сказано, что
"Обработчик, реализованный в виде COM-библиотеки, должен содержать только один COM-объект, имплементирующий интерфейс: interface IEventHandler : public IDispatch ...",
но не удалось найти рабочий пример реализации библиотеки именно на С#.
Снимок экрана 2024-03-06 175045.jpg
Снимок экрана 2024-03-06 175834.jpg
Пробовал так, но при регистрации в Лоцман Конфигуратор вылазит ошибка "Невозможно получить CLSID":
using System;
using System.Runtime.InteropServices;
using Ascon.Plm.ServerApi;
namespace MyServiceEventHandler
{
[Guid("5466E2C2-0F7A-4DD4-BC6C-A9A3DB01E59A")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IEventHandler
{
[DispId(0x00000001)]
int Run(IntPtr pLAS, object[] vaParams, out int inReturnCode, out string stErrorMessage, out int inFlowDirectionCode);
}
[Guid("C25693A8-33E5-4AF1-9E57-7DB7EB241F81")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class MyServiceEventHandler : IEventHandler
{
public MyServiceEventHandler() { }
public int Run(IntPtr pLAS, object[] vaParams, out int inReturnCode, out string stErrorMessage, out int inFlowDirectionCode)
{
IMainSystem system = (IMainSystem)Marshal.GetTypedObjectForIUnknown(pLAS, typeof(IMainSystem));
inReturnCode = 0;
stErrorMessage = "";
inFlowDirectionCode = 0;
return 0;
}
}
}
Пробовал так с последующией сборкой под х64 и регистрацией через "regasm MyServiceEventHandler.dll /register"
- ошибка "Невозможно получить CLSID" осталась.
using System;
using System.Runtime.InteropServices;
namespace MyServiceEventHandler
{
[Guid("51B30FF7-09E9-4499-9B74-5D1DCC81AF7B")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IEventHandler
{
[DispId(1)]
int Run(IntPtr pLAS, IntPtr vaParams, out IntPtr inReturnCode, out IntPtr stErrorMessage, out IntPtr inFlowDirectionCode);
}
[Guid("C25693A8-33E5-4AF1-9E57-7DB7EB241F81")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IEventHandler))]
[ComVisible(true)]
public class MyServiceEventHandler : IEventHandler
{
public MyServiceEventHandler() { }
public int Run(IntPtr pLAS, IntPtr vaParams, out IntPtr inReturnCode, out IntPtr stErrorMessage, out IntPtr inFlowDirectionCode)
{
inReturnCode = IntPtr.Zero;
stErrorMessage = IntPtr.Zero;
inFlowDirectionCode = IntPtr.Zero;
return 0;
}
}
}
Разобрался как вызывать С# DLL через WSC, если кому интересно то могу расписать подробнее