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

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

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

Стоит задача написания программы для связи пока что двух ПК посредством интерфейса CAN. Имеется USB-CAN конвертер. Необходимо написать программу общения ПК на C#. Для него имееться библиотека написаная на Си. В проекте пытаюсь подключить одну из функций
Листинг программы
  1. [DllImport("slmcp.dll", EntryPoint = "CnOpenLibrary")]
  2. static extern Boolean _OpenLib();
В обработчике событий кнопки(к примеру) пытаюсь вызвать метод.По нажатию кнопки компилятор ругается следующим образом: "Не удается найти точку входа "CnOpenLibrary" в DLL "slmcp.dll" ".
Листинг программы
  1. Private void button1_Click ( object sender, EventArgs e)
  2. {
  3. _OpenLib();
  4. }
Ниже приведен заголовочный файл библиотеки:
Листинг программы
  1. //
  2. // slconv.h
  3. //
  4. // version 2.1.1
  5. // Copyright (C) 2002-2005 Slavna Ltd. Zarechny Russia <http://www.slavna.ru>
  6. // 11.2005
  7. //
  8. #ifndef __SLMCP_H_
  9. #define __SLMCP_H_
  10. #ifndef UCHAR
  11. #define UCHAR unsigned char
  12. #endif
  13. #ifndef ULONG
  14. #define ULONG unsigned long
  15. #endif
  16. #ifndef PUCHAR
  17. #define PUCHAR unsigned char *
  18. #endif
  19. #ifndef PULONG
  20. #define PULONG unsigned long *
  21. #endif
  22. /// параметр aBaud для установки скорости CAN передачи
  23. #define cCAN_BD_1000 0x00
  24. #define cCAN_BD_800 0x01
  25. #define cCAN_BD_500 0x02
  26. #define cCAN_BD_250 0x03
  27. #define cCAN_BD_125 0x04
  28. #define cCAN_BD_50 0x05
  29. #define cCAN_BD_20 0x06
  30. #define cCAN_BD_10 0x07
  31.  
  32. // идентификатор CAN контроллера
  33. #define infoMCP2515 0x10
  34. // признак запроса удалённой передачи (Remote Transmit Request)
  35. #define flag_RTR 0x40
  36. // признак запроса удалённой передачи (Remote Transmit Request) принятого пакета
  37. // с расширенным идентификатором
  38. #define flag_RX_RTR_Ext 0x40
  39. // признак запроса удалённой передачи (Remote Transmit Request) принятого пакета
  40. // со стандартным идентификатором
  41. #define flag_RX_RTR_St 0x100000
  42. // признак расширенного идентификатора пакета
  43. #define flag_IDEXT 0x80000
  44. // признак аппаратного переполнения ( в контроллере)
  45. #define stat_HD_OVERFLOW 0x01
  46. // признак программного переполнения ( буфера в драйвере)
  47. #define stat_SOFT_OVERFLOW 0x02
  48. // таймаут передачи. Ошибка CAN канала
  49. #define stat_TX_TIMEOUT 0x10
  50. // константы для устновки режима использования фильтров. Фильтры использовать для
  51. // пакетов со стандартным идентификатором
  52. #define rxm_FILTER_ID_STD 0x20
  53. // пакетов с расширенным идентификатором
  54. #define rxm_FILTER_ID_EXT 0x40
  55.  
  56. #pragma pack( push, ___slmcp___ )
  57. #pragma pack( 1)
  58. typedef
  59. struct
  60. { ULONG ID; /*идентификатор пакета. Стандартный или расширенный*/
  61. UCHAR DLC; /*количество байт данных в пакете*/
  62. UCHAR d[8]; /*массив данных*/
  63. UCHAR reserv1; /*зарезервировано*/
  64. UCHAR reserv2; /*зарезервировано*/
  65. UCHAR status; /*поле статуса*/
  66. } TCANDATA, *PCANDATA;
  67. typedef
  68. struct
  69. { UCHAR NumChannel;
  70. UCHAR IDRXMode;
  71. } TCHANNELINFO, *PCHANNELINFO;
  72. typedef
  73. union
  74. { TCHANNELINFO CnlInfo;
  75. ULONG maskfilter;
  76. } TMASKORFILTER, *PMASKORFILTER;
  77. typedef
  78. struct
  79. { UCHAR size; /*размер записи*/
  80. UCHAR microcode; /*зарезервировано*/
  81. UCHAR time_assemble_packets; /*время пакетирования USB пакетов*/
  82. UCHAR timeout_can_transaction; /*таймаут отправки CAN пакетов*/
  83. }TDEVPARAM, *PDEVPARAM;
  84. #pragma pack( pop, ___slmcp___ )
  85.  
  86. ULONG ( __stdcall * CnOpen)( UCHAR aNumDev);
  87. ULONG ( __stdcall * CnClose)( ULONG Handle);
  88. ULONG ( __stdcall * CnInit)( ULONG Handle, PUCHAR pDevInfo, bool aBlockRead);
  89. ULONG ( __stdcall * CnSetMaskFilters)( ULONG Handle, PULONG pMF);
  90. ULONG ( __stdcall * CnSetBaudRate)( ULONG Handle, UCHAR aBaud);
  91. ULONG ( __stdcall * CnRecievePackets)( ULONG Handle, PCANDATA pBuf, PULONG pRecievePackets);
  92. ULONG ( __stdcall * CnSendPackets)( ULONG Handle, PCANDATA pBuf, ULONG aSendPackets, PUCHAR pStatus);
  93. ULONG ( __stdcall * CnRecieveEnable)( ULONG Handle);
  94. ULONG ( __stdcall * CnRecieveDisable)( ULONG Handle);
  95. ULONG ( __stdcall * CnGetSerialNumber)( ULONG Handle, PUCHAR pSn, UCHAR aLenBuf);
  96. ULONG ( __stdcall * CnSetRegisters)( ULONG Handle, UCHAR aAddr, UCHAR aBytes, PUCHAR pBuf);
  97. ULONG ( __stdcall * CnGetRegisters)( ULONG Handle, UCHAR aAddr, UCHAR aBytes, PUCHAR pBuf);
  98. ULONG ( __stdcall * CnSetDevParameters) (ULONG Handle, PDEVPARAM pBuf);
  99. ULONG ( __stdcall * CnGetDevParameters) (ULONG Handle, PDEVPARAM pBuf);
  100. HINSTANCE hm;
  101. bool CnOpenLibrary()
  102. { hm = LoadLibrary("slmcp.dll");
  103. if ( hm != NULL)
  104. { CnOpen = (ULONG (__stdcall *)(UCHAR)) GetProcAddress(hm, "CnOpen");
  105. CnClose = (ULONG (__stdcall *)(ULONG)) GetProcAddress(hm, "CnClose");
  106. CnInit = (ULONG ( __stdcall *)(ULONG, PUCHAR, bool)) GetProcAddress(hm, "CnInit");
  107. CnSetMaskFilters = (ULONG ( __stdcall *)(ULONG, PULONG)) GetProcAddress(hm, "CnSetMaskFilters");
  108. CnSetBaudRate = (ULONG ( __stdcall *)(ULONG, UCHAR)) GetProcAddress(hm, "CnSetBaudRate");
  109. CnRecievePackets = (ULONG ( __stdcall *)(ULONG, PCANDATA, PULONG)) GetProcAddress(hm, "CnRecievePackets");
  110. CnSendPackets = (ULONG ( __stdcall *)( ULONG, PCANDATA, ULONG, PUCHAR)) GetProcAddress(hm, "CnSendPackets");
  111. CnRecieveEnable = (ULONG ( __stdcall *)(ULONG)) GetProcAddress(hm, "CnRecieveEnable");
  112. CnRecieveDisable = (ULONG ( __stdcall *)(ULONG)) GetProcAddress(hm, "CnRecieveDisable");
  113. CnGetSerialNumber = (ULONG ( __stdcall *)( ULONG, PUCHAR, UCHAR)) GetProcAddress( hm, "CnGetSerialNumber");
  114. CnSetRegisters = (ULONG ( __stdcall *)( ULONG, UCHAR, UCHAR, PUCHAR)) GetProcAddress(hm, "CnSetRegisters");
  115. CnGetRegisters = (ULONG ( __stdcall *)( ULONG, UCHAR, UCHAR, PUCHAR)) GetProcAddress(hm, "CnGetRegisters");
  116. CnSetDevParameters = (ULONG ( __stdcall *)( ULONG, PDEVPARAM)) GetProcAddress(hm, "CnSetDevParameters");
  117. CnGetDevParameters = (ULONG ( __stdcall *)( ULONG, PDEVPARAM)) GetProcAddress(hm, "CnGetDevParameters");
  118. }
  119. return (CnOpen != NULL) & (CnClose != NULL) & (CnInit != NULL) & (CnSetMaskFilters != NULL) &
  120. (CnSetBaudRate != NULL) & (CnRecievePackets != NULL) & (CnSendPackets != NULL) &
  121. (CnRecieveEnable != NULL) & (CnRecieveDisable != NULL) & (CnGetSerialNumber != NULL) &
  122. (CnSetRegisters != NULL) & (CnGetRegisters != NULL) &
  123. (CnSetDevParameters != NULL) & (CnGetDevParameters != NULL);
  124. }
  125. void CnCloseLibrary()
  126. { FreeLibrary( hm);
  127. }
  128. #endif /* __SLCONV_H_ */

Решение задачи: «Не удается подключить библиотеку, написанную на C»

textual
Листинг программы
  1. CAN_Converter.TCANDATA CANpackets;
  2. ........
  3.             //send packets
  4.             CANpackets.ID = 0x80002;
  5.             CANpackets.DLC = 1;
  6.             CANpackets.d[0] = 2;
  7.  
  8.             packets = (uint)Marshal.SizeOf(typeof(CAN_Converter.TCANDATA));
  9.             var resultSend = CAN_Converter.CnSendPackets(DevHandle, ref CANpackets, 1, ref status);
  10.             if (resultSend == 0) MessageBox.Show("Cannot send pack");

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут