Не удается подключить библиотеку, написанную на C - C#
Формулировка задачи:
Стоит задача написания программы для связи пока что двух ПК посредством интерфейса CAN.
Имеется USB-CAN конвертер. Необходимо написать программу общения ПК на C#.
Для него имееться библиотека написаная на Си.
В проекте пытаюсь подключить одну из функций
В обработчике событий кнопки(к примеру) пытаюсь вызвать метод.По нажатию кнопки компилятор ругается следующим образом: "Не удается найти точку входа "CnOpenLibrary" в DLL "slmcp.dll" ".
Ниже приведен заголовочный файл библиотеки:
[DllImport("slmcp.dll", EntryPoint = "CnOpenLibrary")]
static extern Boolean _OpenLib();Private void button1_Click ( object sender, EventArgs e)
{
_OpenLib();
}//
// slconv.h
//
// version 2.1.1
// Copyright (C) 2002-2005 Slavna Ltd. Zarechny Russia <http://www.slavna.ru>
// 11.2005
//
#ifndef __SLMCP_H_
#define __SLMCP_H_
#ifndef UCHAR
#define UCHAR unsigned char
#endif
#ifndef ULONG
#define ULONG unsigned long
#endif
#ifndef PUCHAR
#define PUCHAR unsigned char *
#endif
#ifndef PULONG
#define PULONG unsigned long *
#endif
/// параметр aBaud для установки скорости CAN передачи
#define cCAN_BD_1000 0x00
#define cCAN_BD_800 0x01
#define cCAN_BD_500 0x02
#define cCAN_BD_250 0x03
#define cCAN_BD_125 0x04
#define cCAN_BD_50 0x05
#define cCAN_BD_20 0x06
#define cCAN_BD_10 0x07
// идентификатор CAN контроллера
#define infoMCP2515 0x10
// признак запроса удалённой передачи (Remote Transmit Request)
#define flag_RTR 0x40
// признак запроса удалённой передачи (Remote Transmit Request) принятого пакета
// с расширенным идентификатором
#define flag_RX_RTR_Ext 0x40
// признак запроса удалённой передачи (Remote Transmit Request) принятого пакета
// со стандартным идентификатором
#define flag_RX_RTR_St 0x100000
// признак расширенного идентификатора пакета
#define flag_IDEXT 0x80000
// признак аппаратного переполнения ( в контроллере)
#define stat_HD_OVERFLOW 0x01
// признак программного переполнения ( буфера в драйвере)
#define stat_SOFT_OVERFLOW 0x02
// таймаут передачи. Ошибка CAN канала
#define stat_TX_TIMEOUT 0x10
// константы для устновки режима использования фильтров. Фильтры использовать для
// пакетов со стандартным идентификатором
#define rxm_FILTER_ID_STD 0x20
// пакетов с расширенным идентификатором
#define rxm_FILTER_ID_EXT 0x40
#pragma pack( push, ___slmcp___ )
#pragma pack( 1)
typedef
struct
{ ULONG ID; /*идентификатор пакета. Стандартный или расширенный*/
UCHAR DLC; /*количество байт данных в пакете*/
UCHAR d[8]; /*массив данных*/
UCHAR reserv1; /*зарезервировано*/
UCHAR reserv2; /*зарезервировано*/
UCHAR status; /*поле статуса*/
} TCANDATA, *PCANDATA;
typedef
struct
{ UCHAR NumChannel;
UCHAR IDRXMode;
} TCHANNELINFO, *PCHANNELINFO;
typedef
union
{ TCHANNELINFO CnlInfo;
ULONG maskfilter;
} TMASKORFILTER, *PMASKORFILTER;
typedef
struct
{ UCHAR size; /*размер записи*/
UCHAR microcode; /*зарезервировано*/
UCHAR time_assemble_packets; /*время пакетирования USB пакетов*/
UCHAR timeout_can_transaction; /*таймаут отправки CAN пакетов*/
}TDEVPARAM, *PDEVPARAM;
#pragma pack( pop, ___slmcp___ )
ULONG ( __stdcall * CnOpen)( UCHAR aNumDev);
ULONG ( __stdcall * CnClose)( ULONG Handle);
ULONG ( __stdcall * CnInit)( ULONG Handle, PUCHAR pDevInfo, bool aBlockRead);
ULONG ( __stdcall * CnSetMaskFilters)( ULONG Handle, PULONG pMF);
ULONG ( __stdcall * CnSetBaudRate)( ULONG Handle, UCHAR aBaud);
ULONG ( __stdcall * CnRecievePackets)( ULONG Handle, PCANDATA pBuf, PULONG pRecievePackets);
ULONG ( __stdcall * CnSendPackets)( ULONG Handle, PCANDATA pBuf, ULONG aSendPackets, PUCHAR pStatus);
ULONG ( __stdcall * CnRecieveEnable)( ULONG Handle);
ULONG ( __stdcall * CnRecieveDisable)( ULONG Handle);
ULONG ( __stdcall * CnGetSerialNumber)( ULONG Handle, PUCHAR pSn, UCHAR aLenBuf);
ULONG ( __stdcall * CnSetRegisters)( ULONG Handle, UCHAR aAddr, UCHAR aBytes, PUCHAR pBuf);
ULONG ( __stdcall * CnGetRegisters)( ULONG Handle, UCHAR aAddr, UCHAR aBytes, PUCHAR pBuf);
ULONG ( __stdcall * CnSetDevParameters) (ULONG Handle, PDEVPARAM pBuf);
ULONG ( __stdcall * CnGetDevParameters) (ULONG Handle, PDEVPARAM pBuf);
HINSTANCE hm;
bool CnOpenLibrary()
{ hm = LoadLibrary("slmcp.dll");
if ( hm != NULL)
{ CnOpen = (ULONG (__stdcall *)(UCHAR)) GetProcAddress(hm, "CnOpen");
CnClose = (ULONG (__stdcall *)(ULONG)) GetProcAddress(hm, "CnClose");
CnInit = (ULONG ( __stdcall *)(ULONG, PUCHAR, bool)) GetProcAddress(hm, "CnInit");
CnSetMaskFilters = (ULONG ( __stdcall *)(ULONG, PULONG)) GetProcAddress(hm, "CnSetMaskFilters");
CnSetBaudRate = (ULONG ( __stdcall *)(ULONG, UCHAR)) GetProcAddress(hm, "CnSetBaudRate");
CnRecievePackets = (ULONG ( __stdcall *)(ULONG, PCANDATA, PULONG)) GetProcAddress(hm, "CnRecievePackets");
CnSendPackets = (ULONG ( __stdcall *)( ULONG, PCANDATA, ULONG, PUCHAR)) GetProcAddress(hm, "CnSendPackets");
CnRecieveEnable = (ULONG ( __stdcall *)(ULONG)) GetProcAddress(hm, "CnRecieveEnable");
CnRecieveDisable = (ULONG ( __stdcall *)(ULONG)) GetProcAddress(hm, "CnRecieveDisable");
CnGetSerialNumber = (ULONG ( __stdcall *)( ULONG, PUCHAR, UCHAR)) GetProcAddress( hm, "CnGetSerialNumber");
CnSetRegisters = (ULONG ( __stdcall *)( ULONG, UCHAR, UCHAR, PUCHAR)) GetProcAddress(hm, "CnSetRegisters");
CnGetRegisters = (ULONG ( __stdcall *)( ULONG, UCHAR, UCHAR, PUCHAR)) GetProcAddress(hm, "CnGetRegisters");
CnSetDevParameters = (ULONG ( __stdcall *)( ULONG, PDEVPARAM)) GetProcAddress(hm, "CnSetDevParameters");
CnGetDevParameters = (ULONG ( __stdcall *)( ULONG, PDEVPARAM)) GetProcAddress(hm, "CnGetDevParameters");
}
return (CnOpen != NULL) & (CnClose != NULL) & (CnInit != NULL) & (CnSetMaskFilters != NULL) &
(CnSetBaudRate != NULL) & (CnRecievePackets != NULL) & (CnSendPackets != NULL) &
(CnRecieveEnable != NULL) & (CnRecieveDisable != NULL) & (CnGetSerialNumber != NULL) &
(CnSetRegisters != NULL) & (CnGetRegisters != NULL) &
(CnSetDevParameters != NULL) & (CnGetDevParameters != NULL);
}
void CnCloseLibrary()
{ FreeLibrary( hm);
}
#endif /* __SLCONV_H_ */Решение задачи: «Не удается подключить библиотеку, написанную на C»
textual
Листинг программы
CAN_Converter.TCANDATA CANpackets;
........
//send packets
CANpackets.ID = 0x80002;
CANpackets.DLC = 1;
CANpackets.d[0] = 2;
packets = (uint)Marshal.SizeOf(typeof(CAN_Converter.TCANDATA));
var resultSend = CAN_Converter.CnSendPackets(DevHandle, ref CANpackets, 1, ref status);
if (resultSend == 0) MessageBox.Show("Cannot send pack");