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