2010-11-19 144 views
1

嗨,所有 我試圖從我的非託管c-dll獲取數據。 c函數需要一個指向結構的指針,用一些值初始化結構並完成。這個錯誤可能在任何地方,即使在C DLL聲明。 (我在這做了第一次)調用結構指針的C函數作爲參數

這裏的C代碼h文件:

#ifndef MYFUNCS_H 
#define MYFUNCS_H 

__declspec(dllexport) typedef struct t_Point{ 
int x; 
int y; 
} Point; 

__declspec(dllexport) Point myFuncs(); 
__declspec(dllexport) int getPoint(Point* point); 
#endif 

C-文件:

#include "stdafx.h" 
#include "OpenCVTest.h" 

int getPoint(Point* point){ 
point->x = 4; 
point->y = 2; 
return 0; 
} 

在C#中的包裝:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace CSharp_mit_OpenCV 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct Point 
    { 
     public int x; 
     public int y; 
    }; 

    class Wrapper 
    { 
     [DllImport("OpenCV Test.dll", CharSet= CharSet.Auto)] 
     public static extern int getPoint(ref Point point); 

    } 
} 

而使用該包裝的c#函數:

Point p = new Point(); 
      Wrapper.getPoint(ref p); 
      textBox1.Text = p.x.ToString(); 
      textBox2.Text = p.y.ToString(); 

有了這個代碼,我得到以下運行時錯誤:

「來的PInvoke函數調用‘CSHARP麻省理工學院的OpenCV CSharp_mit_OpenCV.Wrapper ::用GetPoint!’的不平衡堆棧。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查調用約定和的PInvoke簽名的參數相匹配的非託管的目標籤名。」

有什麼不對嗎?請幫幫忙! 謝謝大家!

回答

0

哪個calling convention是使用你的C項目?如果是cdecl (默認IIRC),您需要在您的DllImport屬性中明確指定它:

[DllImport("OpenCV Test.dll", CharSet = CharSet.Auto, 
    CallingConvention = CallingConvention.Cdecl)] 
public static extern int getPoint(ref Point point);