Не удается подключить библиотеку, написанную на 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");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д