2013-05-14 283 views
-1

我想從C#程序中編譯的C/C++ dll調用一些函數。我已經成功地調用了幾個函數,但是在一對夫婦中遇到了麻煩。從C調用C/C++ dll函數#

Compliled 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#實現(與用於類的包裝功能一起):

[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; 
    } 

在運行時,下面的錯誤正在引發。 有什麼,我失蹤?

更新了錯誤的文字:

「PInvokeStackImbalance檢測」 「A調用的PInvoke功能有不平衡堆棧這可能是因爲託管的PInvoke簽名不‘DLLTalk DLLTalk.DLLClass :: ADS1292R_Get_Version!’。匹配非託管目標籤名,檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名匹配。「

+2

您是否收到錯誤消息?它是什麼? –

+1

另請注意,您不需要C++通過[串口]進行通信(http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx) – Lol4t0

+0

您提出了一個問題.........但是參考什麼?你沒有提到你遇到的任何問題/錯誤。 – tnw

回答