Использование unmanaged dll из C#, часть 3

Продолжаю описание перевода мною инструментария работы с приборчиком на C#

Для обработки событий (прием CAN-кадра, факт оправки(опустошения буфера отправки), или возникновение ошибки) в библиотеке CHAI предусмотрена возможность установить функции обработчики. Прототип функции обработчика:

Где ev – код события. Обработчик устанавливается с помощью функции:

Теперь, попробуем все это заставить работать в C#, во-первых объявим прототип делегата:

далее, подключаем функцию CiSetCB

Обращаю внимание. С начала, я по-аналогии с canmsg_t * mbuf попытался маршалировать *ci_handler как ref ci_handler handler, но это вызвало исключение. Тогда почитав более внимательно документацию, я понял, что ref тут излишен.
И еще один момент. Если в С/С++ мы просто объявляли функцию, и передавали потом ее адрес как handler, то здесь надо сделать одно лишнее действие. Привожу код целиком, чтобы было понятнее.

С начала, я пытался просто добавлять текст в TextBox на главной форме, но стало вылезать исключение, «доступ к контролу из потока не создававшего контрол» или как-то так, по смыслу. Тогда пришлось сделать «нормальные» функции лога, заодно добавив преобразование canmsg_t в текст.

Здесь, проверяется откуда вызван метод (требуется ли Invoke) и если требуется, то вместо простого добавления вызывается делегат через функцию Invoke, которая выполняет переданный делегат в потоке, где создавался контрол. Чтобы не создавать функцию делегат явно, мы создаем его «виртуально» через new Action сначала описывая его действия, как textBox1.AppendText( Environment.NewLine + s1) а потом, тут же передавая s (или chan.ToString() + «) » + s + CanMsgToStr(ref msg) в другом варианте функции) в качестве заявленного параметра string s1.

продолжение…

One comment

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *