gpt4 book ai didi

c# - 将数组从 C# 编码到 C++ 并返回 : PInvokeStackImbalance

转载 作者:行者123 更新时间:2023-11-30 16:33:27 25 4
gpt4 key购买 nike

我有一个 C++ 函数,我想从 C# 访问它。问题是我不断收到 PInvokeStackImbalance 异常,我不知道为什么。当检查该异常关闭时,一切都运行良好并且符合预期。

我的 C++ 函数的签名是:

extern "C" double solveQP(
int32_t n, int32_t mE, int32_t mI,
double *p_G, double *p_g0,
double *p_CE, double *p_ce0,
double *p_CI, double *p_ci0,
double *p_x)

我用来访问它的是:

        [DllImport("libQuadProg.dll")]
[return: MarshalAs(UnmanagedType.R8)]
private static extern double solveQP(
[In, MarshalAs(UnmanagedType.I4)] int n,
[In, MarshalAs(UnmanagedType.I4)] int mE,
[In, MarshalAs(UnmanagedType.I4)] int mI,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_G,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_g0,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_CE,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_ce0,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_CI,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_ci0,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_x);

我也尝试过只使用 UnmanagedType.LPArray 选项,但什么也没有。我想有一个关于 PInvoke 的细节我只是不明白,如果有人指出它,我将不胜感激。

最佳答案

您需要使用 DllImport 的 CallingConvention 属性。此处需要 Cdecl,因为您没有将 C 函数声明为 __stdcall。您不需要 [MarshalAs],您使用的值已经是默认值。因此:

    [DllImport("libQuadProg.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern double solveQP(
int n, int mE, int mI,
double[] p_G,
// etc...
}

关于c# - 将数组从 C# 编码到 C++ 并返回 : PInvokeStackImbalance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3201556/

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