J’essaie de rassembler une structure de C à C #, je ne sais pas par où commencer

Ma structure en C ++ est la suivante

/* this structure contains the xfoil output parameters vs angle of attack */ typedef struct xfoil_outputdata_struct { double *pAlfa; double *pCL; double *pCM; double *pCDi; double *pCDo; double *pCPmax; long nEnsortinges; } XFOIL_OUTPUT_DATA; /* Here are the function prototypes for XFoil */ __declspec(dllexport) XFOIL_OUTPUT_DATA *xfoilResults(); /* get output from xfoil */ 

J’utilise XFoilResults pour remettre cette structure en C #

Mon instruction DLL Imports est la suivante:

  [DllImport("xfoilapi.dll")] public static extern void xfoilResults(); 

Est-ce correct? Je n’ai aucun contrôle sur le code C ++. Je dois juste être capable de tirer la structure en C #. La structure C # que j’ai jusqu’à présent est la suivante

 [StructLayout(LayoutKind.Sequential)] public struct xfoilResults { IntPtr pAlfa; IntPtr pCL; IntPtr pCM; IntPtr pCDi; IntPtr pCDo; IntPtr pCPmax; long nEnsortinges; } 

Comment puis-je remplir cette structure C # avec les données du code C ++?

    StructLayout doit être sur une classe.

    Cela devrait faire l’affaire:

     [DllImport("xfoilapi.dll")] public static extern IntPtr GetXfoilResults(); [StructLayout(LayoutKind.Sequential)] public class XfoilResults { IntPtr pAlfa; IntPtr pCL; IntPtr pCM; IntPtr pCDi; IntPtr pCDo; IntPtr pCPmax; int nEnsortinges; // thanks to guys for reminding me long is 4 bytes } XfoilResults xf == new XfoilResults(); Marshal.PtrToStructure(GetXfoilResults(), xf); 

    Tout d’abord, le type de retour de votre fonction imscope doit être IntPtr ou [MarshalAs(UnmanagedType.LPStruct)] xfoilResults_t .

    Une deuxième remarque importante est que, si xfoilResults () alloue et remplit les données dans cette structure, il devrait exister une seconde fonction pour nettoyer cette mémoire. Vous devez également importer cela – et appelez-le si nécessaire, sinon vous obtiendrez des memory leaks.

    Si vous voulez classer cela manuellement (c’est-à-dire que l’importation renvoie un IntPtr), vous devriez pouvoir utiliser

     IntPtr retval = xfoilResults(); var results = (xfoilResults_t)Marshal.PtrToStructure( retVal, typeof(xfoilResults_t)); //Do the following for each IntPtr field double[] pCL = new double[results.nEnsortinges]; Marshal.Copy(results.pCL, pCL, 0, results.nEnsortinges); //Don't forget to call whichever function is cleaning up the unmanaged memory.