Обработчик серверного события на С#

Автор RostislavShkolnyj, 06.03.24, 18:14:39

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

RostislavShkolnyj

Добрый день, коллеги!

поделитесь пожалуйста примером на С# простейшего обработчика реализующего COM-интерфейс обработчика серверного события.

в документации "Серверные события.chm" сказано, что
"Обработчик, реализованный в виде COM-библиотеки, должен содержать только один COM-объект, имплементирующий интерфейс: interface IEventHandler : public IDispatch ...",

но не удалось найти рабочий пример реализации библиотеки именно на С#.

Снимок экрана 2024-03-06 175045.jpg
Снимок экрана 2024-03-06 175834.jpg

RostislavShkolnyj

Пробовал так, но при регистрации в Лоцман Конфигуратор вылазит ошибка "Невозможно получить 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;
        }
    }
}

RostislavShkolnyj

Пробовал так с последующией сборкой под х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;
        }
    }
}

RostislavShkolnyj

Разобрался как вызывать С# DLL через WSC, если кому интересно то могу расписать подробнее