Structure nestede unmarshalling

Il y a deux structures non gérées

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

et analogues gérés correspondants

 [StructLayoutAtsortingbute(LayoutKind.Sequential)] public unsafe class Multipolynomial { public int n; public int max_power; public double* X; public double** Y; } [StructLayoutAtsortingbute(LayoutKind.Sequential)] public unsafe struct Output { public double d; public Multipolynomial mp; } 

Et il y a une fonction native

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

avec signature gérée

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

qui se bloque ici

 Output output = MathKernel.foo(); 

avec explication “La signature de type de la méthode n’est pas compatible PInvoke.”

S’il vous plaît signaler ce qui ne va pas?

PS: veuillez noter que l’analogue géré pour la structure multipolynomiale est la classe

MSDN : P / Invoke ne peut pas avoir de types non compressibles comme valeur de retour. C’est pourquoi vous obtenez l’erreur que vous obtenez. En outre, vos définitions gérées ne correspondent pas à vos définitions non gérées. La output non gérée contient multipolynomial valeur multipolynomial , mais votre équivalent géré la contient par référence (en outre, les références d’object ne sont pas explicables). Le Multipolynomial géré doit être une structure et vous devez spécifier [MarshalAs(UnmanagedType.Struct)] sur le champ mp – voir Structure nestede MarshalAs . En outre, je ne suis pas sûr que les indicateurs dangereux soient verrouillés. Remplacez-les par IntPtr pendant que vous testez cela, puis remettez les pointeurs dans IntPtr