C#에서 전달된 구조에 C++의 구조체에 값을 할당하는 중에 문제가 발생했습니다.

StackOverflow https://stackoverflow.com/questions/1903173

문제

C++로 작성된 DLL에 구조 배열을 전달하는 C# 함수가 있습니다.구조체는 int 그룹이며 DLL에서 데이터를 읽을 때 모든 값이 제대로 나옵니다.그러나 C++에서 요소에 쓰려고 하면 C#에서 다시 읽으려고 할 때 값이 표시되지 않습니다.

씨#

[StructLayout(LayoutKind.Sequential)]
struct Box
{
  public int x;
  public int y;
  public int width;
  public int height;
}

[StructLayout(LayoutKind.Sequential)]
struct Spot
{
  public int x;
  public int y;
}

static void TestCvStructs()
{
  int len = 100;
  Box[] r = new Box[len];
  Spot[] p = new Spot[len];

  for (int i = 0; i < len; i++)
  {
    r[i].x = i*10;
    r[i].y = i * 200;
    r[i].width = r[i].x * 10;
    r[i].height = r[i].y * 100 + r[i].x * 5;

    p[i].x = i * 8;
    p[i].y = i * 12;
  }

  PassCvStructs(len, r, p);

  for (int i = 0; i < len; i++)
  {
    Console.WriteLine("Point/x:{0} Boxes/x{1}", p[i].x, r[i].x );
  }
}

[DllImport(dll)]
private static extern int PassSomeStructs(int count, Box[] boxes, Spot[] points);

C++

typedef struct Box
{
  int x;
  int y;
  int width;
  int height;
} Box;

typedef struct Spot
{
  int x;
  int y;
} Spot;

CPPDLL_API int PassSomeStructs(int arrayLength, Box *boxes, Spot *points)
{
  for(int i = 0; i < arrayLength; ++i)
  {
    printf("Group:%i\n", i);
    printf("Rect - x:%i y:%i width:%i length:%i\n", boxes[i].x, boxes[i].y, boxes[i].width, boxes[i].height);
    printf("Point - x:%i y:%i\n", points[i].x, points[i].y);
    printf("\n");

    points[i].x = 3;
    boxes[i].x = 1;
  }
  return 0;
}
도움이 되었습니까?

해결책 3

답변이 다른 질문에 게시 된 것을 발견했습니다. C#의 스트러크 배열을 마샬링하는 방법은 무엇입니까?

마샬링이 분명히 기본값은 매개 변수를 마샬링하는 것입니다. 그렇지 않으면 그들은 외부 또는 밖으로 명시 적으로 선언해야합니다. 해당 내 코드를 명시 적으로 지정 한 후 예제가 작동합니다.

그의 덕분에 비아 대답과 안토 마르코프 마샬에 대한 노출을 위해.

private static extern int PassSomeStructs(int count, [In, Out] Box[] boxes, [In, Out] Spot[] points);

다른 팁

an MDSN 기사 마샬링 어레이에서 : 배열 유형에서 다음 속성을 설정해보십시오. 이것은 일반적으로 C ++에서 C#으로 호출하는 데 사용되지만 C#으로 다시 업데이트 된 값을 가져 오는 데 필요한 것도 필요할 수도 있습니다.

[DllImport(dll)]
private static extern int PassSomeStructs(int count, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] Box[] boxes, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] Spot[] points);

성공적인 양방향 마샬링의 예는 다음과 같은 기사를 참조하십시오.

http://social.msdn.microsoft.com/forums/en-us/csharplanguage/thread/ff0123d0-506b-4de2-bfb5-f690c935826/

C# 외부에 ref/out 키워드를 추가해 보셨나요?

또 다른 아이디어는 클래스 자체 대신 IntPtr을 전달하거나 IntPtr로 전달하는 것입니다.

나는 구조체가 기본적으로 참조로 전달되지 않고 복사된다고 믿습니다.

솔직히 어둠 속에서 찌르고 있지만 아직 답변이 없으므로 이것이 도움이 되기를 바랍니다...

Interop은 아직 "마법 같은" 단계에 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top