使用struct指针作为参数调用C函数

时间:2010-11-19 09:03:44

标签: c# reference call invoke

嗨 我试图从我的非托管c-dll中获取数据。 c函数需要一个指向struct的指针,用一些值初始化struct并完成。错误可能在任何地方,即使在c dll声明中也是如此。 (我这是第一次这样做)

这里是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 mit OpenCV!CSharp_mit_OpenCV.Wrapper :: getPoint'使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查调用约定和参数PInvoke签名与目标非托管签名匹配。“

这里有什么问题?请帮忙! 谢谢大家!

1 个答案:

答案 0 :(得分:0)

您的C项目使用了哪个calling convention?如果是cdecl(默认IIRC),则需要在DllImport属性中明确指定它:

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