2016-02-24 4 views
1

Мне нужно получить значение от C неуправляемый код. Фактически я вызывал функцию из неуправляемого, возвращаемый тип функции - это точка, где точка - это структура.Получите значение от неуправляемого кода до управляемого кода

структура упоминается следующим образом

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

Где Poly и VECTOR являются структура.

На самом деле я получил точку возврата значения как IntPtr в C# .После получения значения IntPtr, я попытался преобразовать это Intptr к Array. Преобразование Array в этом ниже.

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)); 
} 

Но после получения массива значение каждого элемента структуры стали null.What я сделал неправильно на этом, пожалуйста, кто-нибудь предложить мне ......

Я упомянул структуру, созданную в C# Detaily ниже.

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

где поли

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

Coint также структура А

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

где VECTOR

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

     } 

ответ

0

от вас фрагменте кода неясно, как именно структура определена в C Предположим, что по умолчанию выровнены Мент ваше C определение # должно выглядеть следующим образом:

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

вы все равно должны учитывать точное расположение структуры с соответствующим размером пакета обновления (см 1 подробности)

так в вашем коде вы должны сделать следующее:

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)); 

, так как поли и вектора могут быть массивы, вы можете захотеть использовать IntPtr.Add() 2 метод перебора этих массивов.

StructLayoutAttribute.Pack Field

IntPtr.Add

+0

Спасибо за ответ, я поставил деталь структуры, созданной в C# редактируются в той же должности – Shankar