0

2 つの管理されていない構造体があります

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: Multipolynomial 構造体のマネージド アナログはクラスであることに注意してください。

4

1 に答える 1

0

MSDN : P/Invoke は、戻り値として blittable でない型を持つことはできません。そのため、エラーが発生しています。また、マネージド定義がアンマネージド定義と一致しません。アンマネージは値によってoutput含まmultipolynomialれますが、マネージの同等物は参照によってそれを含みます (さらに、オブジェクト参照は blittable ではありません)。管理対象は構造体である必要があり、フィールドでMultipolynomial指定する必要があります— MarshalAs ネストされた構造体を参照してください。さらに、安全でないポインターが blittable かどうかもわかりません。これをテストしている間にそれらを s に置き換えてから、ポインターを元に戻します。[MarshalAs(UnmanagedType.Struct)]mpIntPtr

于 2013-10-05T20:36:41.713 に答える