-1

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# 実装 (クラスのラッパー関数と共に):

  [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 が検出されました」「PInvoke 関数 'DLLTalk!DLLTalk.DLLClass::ADS1292R_Get_Version' の呼び出しにより、スタックのバランスが崩れました。これは、マネージド PInvoke シグネチャがアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。 PInvoke 署名がターゲットの管理されていない署名と一致します。」

4

1 に答える 1

1

CallingConvention 属性の設定も忘れないでください。また、64 ビット プロセスでは 32 ビット アセンブリを読み込めないため、呼び出そうとしているネイティブ C++ ライブラリが 64 ビットか 32 ビットかを示すことをお勧めします。

C# DllImport で 32 ビットまたは 64 ビットの dll を使用する

于 2013-05-14T20:04:45.470 に答える