gpt4 book ai didi

c# - 使用 P/Invoke 编码双参数

转载 作者:行者123 更新时间:2023-11-28 01:09:16 28 4
gpt4 key购买 nike

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

我的导出方法如下所示:

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

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

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

This is likely because the managed PInvoke signature does not match the unmanaged target signature.

我试着用这个调用方法:

[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++ 原型(prototype)并更改 P/Invoke 声明:

[DllImport("InferenceEngine.dll", CallingConvention=CallingConvention.Cdecl)]

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

关于c# - 使用 P/Invoke 编码双参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4328560/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com