문제
다음 구조를 가진 관리되지 않는 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#에 중첩 된 객체의 중재 배열에 문제가 있다는 것을 알고 있습니다. 나는 내가하는 방식이 첫 번째로 돌아올 것이라고 생각하고있었습니다 (내가 관심이있는 모든 것).
그러나이 방법으로 "num_objects"는 1의 값으로 올바르게 채워집니다. Model_ID는 잘못되었고 (메모리 주소처럼 보입니다) 다른 모든 것은 0입니다.
모든 도움이 감사합니다. 나는 관리 코드를 무의미하게하기 위해 구조를 전달하는 많은 작업을 수행했지만,이 복잡한 것은 결코 원격으로 아무것도하지 않았습니다.
해결책
ppr_object_list_type
a 바늘 a 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