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

Продолжаю повествование о моей попытке перехода поддержки девайса на C#.
Далее, таким же образом объявляем все структуры и функции из файла заголовка chai.h. Заострю внимание лишь на нескольких моментах.
Первое. Функции принимающие в качестве параметра указатель на строку.
Для этого параметра надо указать, как интерпретировать такой указатель:

В данном случае, указатель на «побайтную» строку (LPStr).

Второе, функции CiWrite и CiRead принимают в качестве параметра указатель на структуру canmsg_t. При этом подразумевается массив структур. Хотя чаще всего передается и принимается только одно значение(сообщение). Причем функция CiWrite, начиная с версии Chai 2.0 разрешает передавать, как раз, только одну запись. И параметр cnt в ней оставлен лишь для совместимости.

Для того, чтобы избежать необходимости всегда объявлять массив, я дважды объявил функцию CiRead указав разный тип маршалинга для параметра mbuf. Причем, во-втором случае, в атрибутах параметра указано рассматривать его как указатель на массив элементов UnmanagedType.LPArray, размер массива сообщает параметр номер 2 (SizeParamIndex = 2) начиная с нуля, и так же вместо ref, указываю в атрибутах, что это выдаваемые из функции данные [Out].

Третий момент заключается в том, что в C# в отличии от C, #define работает только как опеределено/неопределено. И не позволяет использование в качестве макросов. При этом, та же функция CiSetBaud использует два параметра bt0 и bt1 для того, чтобы задать скорость (битрейт) CAN. И имеются предопроеделенные макросы, с удобочитаемыми именами, позволяющие задать параметры скорости стандартных значений.

Чтобы обеспечить схожее удобство при установке скорости CAN. Пришлось немного схитрить. Объявляем тип:

и объявляем публичные переменные этого типа:

А в секции функций, как и с CiRead объявляем две функции CiSetBaud:

Продолжение следует.

Leave a Reply

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