2016-02-24 1 views
1

Je dois obtenir la valeur du code non géré C. En fait, j'ai appelé la fonction de non géré, le type de retour de la fonction est le point où le point est une structure.Obtenir la valeur du code non géré au code managé

la structure mentionnée manière suivante

typedef struct point 
{ 
    Poly* pol; 
    NL_DEGREE p; 
    VECTOR* vec; 
} Point; 

Lorsque Poly et VECTOR sont structure.

En fait, j'obtenu le point de valeur de retour comme IntPtr dans C# .Après obtenir la valeur de IntPtr, j'ai essayé de convertir ce Intptr à un Array. Convertir le Array de cette manière ci-dessous.

point[] Q = new point[2]; 
int size= Marshal.SizeOf(new point()); 
for (int i = 0; i < 2; i++) 
{ 
    Q[i] = (point)Marshal.PtrToStructure(new IntPtr(Qptr.ToInt32() + (i * size)), typeof(point)); 
} 

Mais après avoir obtenu le tableau de la valeur de chaque élément de structure est devenue null.What j'ai fait tort sur ce point, S'il vous plaît quelqu'un me suggérer ......

je l'ai mentionné la structure créée en C# detaily au dessous de.

public unsafe struct point 
     { 
      public Poly* pol; 
      public NL_DEGREE p; 
      public vECTOR* knt; 
     } 

où le poly

public unsafe struct Poly 
     { 
      public Int32 n; 
      public cpoint* Pw; 
     } 

Coint est également une structure

public struct cpoint 
     { 
      public double x; 
      public double y; 
      public double z; 
      public double w; 
     } 

où VECTOR

public unsafe struct VECTOR 
     {    
      public Int32 m; 
      public double *U;   

     } 

Répondre

0

de code snippet on ne sait pas comment struct exactement est défini dans C En supposant que l'alignement par défaut ment votre C# définition devrait ressembler à:

public class Point 
{ 
    IntPtr pol; 
    NL_DEGREE  p; 
    IntPtr vec; 
} 

vous auriez encore à considérer exactement la mise en page struct avec la taille du pack approprié (voir 1 pour plus de détails)

donc dans votre code vous devez faire ce qui suit:

var point = (Point)Marshal.PtrToStructure(ptr, typeof(Point)); 
var poly = (Poly)Marshal.PtrToStructure(point.pol, typeof(Poly)); 
var vector = (Vector)Marshal.PtrToStructure(point.vec, typeof(Vector)); 

puisque les deux Poly et Vector peuvent être des tableaux que vous voudrez peut-être utiliser IntPtr.Add() méthode 2 à itérer sur ces tableaux.

StructLayoutAttribute.Pack Field

IntPtr.Add

+0

Merci de répondre, je mets le détail de la structure qui a créé en C# édité en même poste – Shankar