Не удается подключить библиотеку, написанную на C - C#

Узнай цену своей работы

Формулировка задачи:

Стоит задача написания программы для связи пока что двух ПК посредством интерфейса CAN. Имеется USB-CAN конвертер. Необходимо написать программу общения ПК на C#. Для него имееться библиотека написаная на Си. В проекте пытаюсь подключить одну из функций
[DllImport("slmcp.dll", EntryPoint = "CnOpenLibrary")]
static extern Boolean _OpenLib();
В обработчике событий кнопки(к примеру) пытаюсь вызвать метод.По нажатию кнопки компилятор ругается следующим образом: "Не удается найти точку входа "CnOpenLibrary" в DLL "slmcp.dll" ".
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");

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5