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