Использовать C DLL в C# проекте - PullRequest
0 голосов
/ 24 февраля 2020

Я сделал проект для своего устройства считывания карт ATM в проекте C ++, и он работает нормально. Когда я пытаюсь использовать один и тот же заголовочный файл и DLL в проекте C#, я получаю эту ошибку:

System.ExecutionEngineException: 'Exception of type 'System.ExecutionEngineException' was thrown.'

C ++ Code

HANDLE port = CommOpenWithBaut(1, 9600);

if (port == 0)
{
    cerr << "Cannot open device";
    return -1;
}

unsigned char PewSt = 0;
unsigned char CardType = 0;
unsigned char CardSt = 0;
unsigned char PowerSt = 0;

int rc = CarderCheckSt(port, PewSt, CardType, CardSt, PowerSt);
//cout << "This is the card Status: " << CarderCheckSt << endl;
int bufferSize = 128;
BYTE buffer[128];

int bytesRead = MagRead(port, buffer, bufferSize);
string text(buffer, buffer + bufferSize);
cerr << "Card Details : " <<text;

CommClose(port);

Порт - это ручка для настройки функции порта CommOpenWithBaut(). CarderCheckSt() проверяет состояние считывателя карт банкомата. MagRead() имеет данные буфера, считанные с карты, а text() преобразует этот буфер в код ASCII. CommClose() закрывает порт после завершения.

C# Код

[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommOpenWithBaut")]
public static extern Handle CommOpenWithBaut(uint nPort, uint _data);

[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommClose")]
public static extern int CommClose(Handle hComHandle);

[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
public static extern int MagRead(Handle hComHandle, Byte[] MagData, int lenth);

[DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
public static extern int CarderCheckSt(Handle hComHandle,  char PewSt,  char CardType,  char CardSt,  char PowerSt);

public Form1()
{
    InitializeComponent();
}

public void button1_Click(object sender, EventArgs e)
{
    Handle port = CommOpenWithBaut(1, 9600);

    Byte[] MagData = {128};

    int lenth = 128;

    MagRead(port, MagData, lenth);

    char PewSt = '0';
    char CardType = '0';
    char CardSt = '0';
    char PowerSt = '0';

    CarderCheckSt(port, PewSt, CardType, CardSt, PowerSt);

    MessageBox.Show($"CarderCheckSt");
    CommClose(port);
}

Я использовал DllImport, чтобы импортировать те же 4 функции из DLL, которые я использовал в предыдущем проекте. Я добавил кнопку при нажатии, она должна делать то же самое.

Это заголовочный файл

#include <iostream>
#include <windows.h>
#ifdef ModuleV188_EXPORTS
#define ModuleV188_API extern "C" __declspec(dllexport)
#else
#define ModuleV188_API extern "C" __declspec(dllimport)
#endif
extern "C" ModuleV188_API HANDLE CommOpenWithBaut(UINT nPort, UINT _data);
extern "C" ModuleV188_API int  CommClose(HANDLE hComHandle);
extern "C" ModuleV188_API int  CarderCheckSt(HANDLE hComHandle, unsigned char& PewSt, unsigned char& CardType, unsigned char& CardSt, unsigned char& PowerSt);
extern "C" ModuleV188_API int  MagRead(HANDLE hComHandle, BYTE* MagData, int& lenth);

Кроме того, когда программа связывается со считывателем карт банкомата, она записывает в журнал. Байты, полученные в журнале для обеих программ.

для С ++ УСПЕШНОЕ ЧТЕНИЕ:

18:58:37    COM1´ٍ؟ھ³ة¹¦
18:58:38    ========> 02000231440376
18:58:39    <======== 0200043144303103

18:58:39    <======== 020004314430310371

18:58:39    ========> 0200023B35030D
18:58:39    <======== 0200773B35594234

в журнале C#:

10:16:37    COM1´ٍ؟ھ³ة¹¦

FIX

        [DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommOpenWithBaut")]
        public static extern IntPtr CommOpenWithBaut(uint nPort, uint _data);

        [DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "CommClose")]
        public static extern int CommClose(IntPtr hComHandle);

        [DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
        public static extern int MagRead(IntPtr hComHandle, byte[] MagData, ref byte lenth);

        [DllImport("F:\\ajm\\Components\\ATM\\New folder (2)\\ATMDev\\ATMCsharp\\inc\\ModuleV188.dll", EntryPoint = "MagRead")]
        public static extern int CarderCheckSt(IntPtr hComHandle, ref byte PewSt, ref byte CardType, ref byte CardSt, ref byte PowerSt);

        public Form1()
        {
            InitializeComponent();
        }

        public void button1_Click(object sender, EventArgs e)
        {

            IntPtr port = CommOpenWithBaut(1, 9600);

            Byte[] MagData = {128};

            byte lenth = 128;

            byte PewSt = 0 ;
            byte CardType = 0;
            byte CardSt = 0;
            byte PowerSt = 0;

           // CarderCheckSt(port, ref PewSt, ref CardType, ref CardSt, ref PowerSt);


            MagRead(port, MagData, ref lenth);


            MessageBox.Show($"rc");
            MessageBox.Show($"read");


            CommClose(port);

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...