0

有两个非托管结构

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:请注意,多项式结构的托管模拟是

4

1 回答 1

0

MSDN:P/Invoke 不能将不可 blittable 类型作为返回值。这就是为什么你得到你得到的错误。此外,您的托管定义与非托管定义不匹配。非托管的按值output包含multipolynomial,但您的托管等效项按引用包含它(此外,对象引用不是 blittable)。managedMultipolynomial必须是一个结构,并且您必须[MarshalAs(UnmanagedType.Struct)]mp字段上指定 - 请参阅MarshalAs 嵌套结构。另外,我不确定不安全的指针是否是 blittable。在测试时将它们替换为IntPtrs,然后将指针放回原处。

于 2013-10-05T20:36:41.713 回答