Question

Je suis en train d'appeler dans une DLL non géré qui a la structure suivante:

typedef struct
    {
      int num_objects;
      ppr_object_type *objects;
    } ppr_object_list_type;
ppr_coordinate_type;

typedef struct
{
  int model_id;
  ppr_coordinate_type position;
  float scale_factor;
  float size;
  ppr_rotation_type rotation;
  int nominal_width;
  int nominal_height;
  float confidence;
  int num_landmarks;
  ppr_landmark_type *landmarks;
} ppr_object_type;

typedef struct
{
  float x;
  float y;
} 

typedef struct
{
  float yaw;
  float pitch;
  float roll;
  ppr_precision_type precision;
} ppr_rotation_type;

est ce que je me sers du côté C #:

[StructLayout(LayoutKind.Sequential)]
    public struct ObjectInfo
    {
        public int numObjects;
        public ObjectType objListPointer;
    }

[StructLayout(LayoutKind.Sequential)]
    public struct ObjectType
    {
        int model_id;
        Coordinate position;
        float scale_factor;
        float size;
        Rotation rotation;
        int nominal_width;
        int nominal_height;
        float confidence;
        int num_landmarks;
        IntPtr landmarks;

    }
    [StructLayout(LayoutKind.Sequential)]
    public struct Coordinate
    {
        float x;
        float y;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct Rotation
    {
        float yaw;
        float pitch;
        float roll;
        int precision;
    }

L'appel que je fais est spécifié comme ceci:

ppr_error_type ppr_detect_objects (ppr_context_type context,
                                   ppr_image_type image,
                                   ppr_object_list_type *object_list);

Mon C # appel ressemble à ceci:

ObjectInfo info = new ObjectInfo();
int objOK = ppr_detect_objects(context, imagePtr, ref info);

Je sais que le ppr_object_list_type attend à remplir un tableau d'objets. Et je sais que C # a des problèmes avec des tableaux arbitray d'objets imbriqués. Je pensais que la façon dont je fais reviendrait seulement la première (ce qui est tout ce que je me soucie de).

Cependant, quand je l'appelle ainsi « num_objects » est rempli correctement avec une valeur de 1. Le model_id est erroné (qui ressemble à une adresse mémoire) et tout le reste des zéros.

Toute aide est appréciée. Je l'ai fait beaucoup de structures de passage de travail à code unmanages, mais jamais rien à distance ce complexe.

Était-ce utile?

La solution

ppr_object_list_type contient un pointeur à un ppr_object_type, pas une valeur ppr_object_type réelle.

Vous devez changer ObjectInfo à

[StructLayout(LayoutKind.Sequential)]
public struct ObjectInfo
{
    public int numObjects;
    public IntPtr objListPointer;
}

Pour accéder aux valeurs de ObjectType, vous aurez besoin d'utiliser les méthodes dans la section la classe de maréchal.

Autres conseils

Cela devrait fonctionner si vous ne vous préoccupez le premier élément:

public struct ObjectInfo
{
    public int numObjects;
    [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)]
    public ObjectType[] objListPointer;
}
scroll top