使用P / Invoke编组双参数

时间:2010-12-01 20:05:19

标签: c# .net c++ interop pinvoke

我正在尝试进行P / Invoke调用。我必须从C#程序中调用C ++类。我有这个类的源代码所以我所做的是把它放在DLL项目中并创建导出函数来访问它的main方法。这应该足以做我需要的事情并保持简单。

我的导出方法如下:

extern "C" _declspec(dllexport) void Inference(double *c1, double *c2, double *c3, double *result)
{
    /* somecode */
}

这个编译,我可以在dumpbin输出中看到导出。

现在问题是,我无法从我的C#代码中调用此方法,因为我总是得到PInvokeStackInbalance异常,告诉我

  

这可能是因为托管   PInvoke签名与   非托管目标签名。

我尝试用这个方法调用方法:

[DllImport("InferenceEngine.dll")]
extern static unsafe void Inference(double *c1, double *c2, double *c3, double *result);

我也试过这个:

[DllImport("InferenceEngine.dll")]
extern static void Inference(ref double c1, ref double c2, ref double c3, ref double result);

...这两种可能的方式都记录在MSDN上,但没有运气。有没有人知道问题是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

您应该将C ++函数声明为__stdcall,这是P / Invoke的默认值:

extern "C" _declspec(dllexport) void __stdcall Inference(double *c1, double *c2, double *c3, double *result);

也可以单独保留C ++原型并更改P / Invoke声明:

[DllImport("InferenceEngine.dll", CallingConvention=CallingConvention.Cdecl)]
P / Invoke经常不使用

cdecl,可能是因为Windows API为stdcall