문제

다음 구조를 가진 관리되지 않는 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top