gpt4 book ai didi

c# - 嵌套结构解码

转载 作者:行者123 更新时间:2023-11-30 17:46:40 24 4
gpt4 key购买 nike

有两个非托管结构

typedef struct multipolynomial
{
int N;
int max_power;
double* X;
double** Y;
} multipolynomial;

typedef struct output
{
double d;
multipolynomial mp;
} output;

以及相应的托管类似物

[StructLayoutAttribute(LayoutKind.Sequential)]
public unsafe class Multipolynomial
{
public int n;
public int max_power;
public double* X;
public double** Y;
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public unsafe struct Output
{
public double d;
public Multipolynomial mp;
}

并且有原生功能

__declspec(dllexport) output __cdecl foo()
{
output out;
out.t = 1;
return out;
}

带有托管签名

[DllImport("kernel.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern Output foo();

这里崩溃了

Output output = MathKernel.foo();

解释“方法的类型签名与 PInvoke 不兼容。”

请指出哪里出了问题?

PS:请注意,多项式结构的托管模拟是

最佳答案

MSDN :P/Invoke 不能将不可直接传送的类型作为返回值。这就是您收到错误的原因。此外,您的托管定义与非托管定义不匹配。非托管输出按值包含多项式,但托管等效项通过引用包含它(此外,对象引用不可blittable)。托管 Multipolynomial 必须是一个结构体,并且您必须在 mp 字段上指定 [MarshalAs(UnmanagedType.Struct)] — 请参阅 MarshalAs nested structure 。此外,我不确定不安全指针是否可以直接传送。在测试时将它们替换为 IntPtr,然后将指针放回原处。

关于c# - 嵌套结构解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200615/

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