繁体   English   中英

用P / Invoke编组双参数

[英]Marshalling double parameters with P/Invoke

我要执行的P / Invoke通话有问题。 我必须从C#程序中调用C ++类。 我有该类的源代码,因此我所做的就是将其放在DLL项目中并创建导出函数以访问它的主要方法。 这应该足以满足我的需求并使事情变得简单。

我的导出方法如下所示:

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上记录的两种可能方法,但是没有运气。 有人对这个问题有什么线索吗?

谢谢 !

您应该将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)]

cdecl / cdecl与P / Invoke一起使用,可能是因为Windows API是stdcall

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM