C# 呼叫C/C++;来自C的dll函数#

C# 呼叫C/C++;来自C的dll函数#,c#,c++,dllimport,C#,C++,Dllimport,我试图从C#程序中编译的C/C++dll调用一些函数。我已经成功地调用了几个函数,但有几个函数遇到了问题 复杂的c/c++函数调用: DECLDIR int ADS1292R_Get_Version(unsigned char ADS129x_Version[]) { unsigned char Wbuf[10]; unsigned char Rbuf[10], RetVal =1; Wbuf[0] = START_DATA_HEADER; // PACKET St

我试图从C#程序中编译的C/C++dll调用一些函数。我已经成功地调用了几个函数,但有几个函数遇到了问题

复杂的c/c++函数调用:

DECLDIR int ADS1292R_Get_Version(unsigned char ADS129x_Version[])
{
unsigned char Wbuf[10];
unsigned char Rbuf[10], RetVal =1;
Wbuf[0] = START_DATA_HEADER;                // PACKET Start header
Wbuf[1] = FIRMWARE_VERSION_REQ;             // Get firmware version info command
Wbuf[2] = 0x00;                             // Not used
Wbuf[3] = 0x00;                             // Not used
Wbuf[4] = 0x00;                             // Not used
Wbuf[5] = END_DATA_HEADER;                  // Packet End header
Wbuf[6] = '\n';


pComPort->Write(Wbuf, 7);                   // Send command to firmware
Sleep(5);
memset(Rbuf,0,7);
pComPort->Read(Rbuf, 7);                    // Receive response from Frimwate

if ((Rbuf[0] == START_DATA_HEADER) 
    && (Rbuf[1] == FIRMWARE_VERSION_PACKET) 
    && (Rbuf[5] == END_DATA_HEADER))
{
    ADS129x_Version[0]= Rbuf[2];            // Get Major Number
    ADS129x_Version[1]= Rbuf[3];            // Get Minor number
    RetVal = 0;                             // Set return val as su
}

return RetVal;
}

C#实现(以及类的包装函数):

在运行时,将引发以下错误。 有什么我遗漏的吗

已更新错误文本:

“检测到PinVokesTack不平衡”
“对PInvoke函数'DLLTalk!DLLTalk.DLLClass::ADS1292R_Get_Version'的调用使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。”

也不要忘记CallingConvention属性设置。同样,如果你想调用的本机C++库是64或32位,那么你就不能用它来表示,因为你不能在64位进程中加载32位程序集。

您是否收到错误消息?还有什么?也请注意,你不需要C++来交流,你问了一个问题……但是关于什么呢?您没有提及任何问题/错误。同意C#可以处理串行端口。已创建DLL以与固件交互。在使用它时试图“作弊”,而不必重新创建整个dll。
  [DllImport("ADS1292R_USB_lib.dll", EntryPoint = "ADS1292R_Get_Version")]
    public static extern int ADS1292R_Get_Version(byte[] x);

    public int getVersion()
    {
        byte[] dataTemp = new byte[3];
        int mydata = ADS1292R_Get_Version(dataTemp);
        if (mydata == 0)
        {
            MessageBox.Show("1:" + dataTemp[0].ToString() 
                            + " 2:" + dataTemp[1].ToString() 
                            + " 3:" + dataTemp[2].ToString());
        }
        return 0;
    }