質問
次の構造を持つアンマネージ DLL を呼び出そうとしています。
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;
これは私が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;
}
私が行っている呼び出しは次のように指定されています。
ppr_error_type ppr_detect_objects (ppr_context_type context,
ppr_image_type image,
ppr_object_list_type *object_list);
私の C# 呼び出しは次のようになります。
ObjectInfo info = new ObjectInfo();
int objOK = ppr_detect_objects(context, imagePtr, ref info);
ppr_object_list_type がオブジェクトの配列を入力することを期待していることはわかっています。また、C# ではネストされたオブジェクトの任意の配列に問題があることも知っています。私のやり方では最初の 1 つだけが返されるだろうと考えていました (私が気にしているのはそれだけです)。
ただし、この方法で呼び出すと、「num_objects」には値 1 が正しく入力されます。model_id が間違っており (メモリ アドレスのように見えます)、その他はすべて 0 です。
助けていただければ幸いです。私は構造体をアンマネージ コードに渡す作業を数多く行ってきましたが、リモートでこれほど複雑なことは初めてでした。
解決
ppr_object_list_type
が含まれています ポインタ に ppr_object_type
, 、実際のものではありません ppr_object_type
価値。
変える必要がある ObjectInfo
に
[StructLayout(LayoutKind.Sequential)]
public struct ObjectInfo
{
public int numObjects;
public IntPtr objListPointer;
}
にアクセスするには、 ObjectType
値を指定するには、次のメソッドを使用する必要があります。 元帥 クラス。
他のヒント
あなたが最初のアイテムだけを気にしている場合、
この作業をする必要があります:
public struct ObjectInfo
{
public int numObjects;
[MarshalAs(UnmanagedType.LPArray, SizeConst = 1)]
public ObjectType[] objListPointer;
}
所属していません StackOverflow