مشكلة تعيين القيم إلى بنية في C ++ إلى هيكل مرت من C #

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

سؤال

لدي وظيفة في C # التي تمر بمجموعة من الهياكل في DLL مكتوبة في C ++. الهيكل عبارة عن مجموعة من المغايات وعندما قرأت البيانات الموجودة في 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 #؟

عندما يكون التنظيم على ما يبدو الافتراضي هو الاستنشاد المعلمات كما في. وإلا فإنهم بحاجة إلى أن يتم الإعلان عن صراحة أو داخل، خارج. بعد تحديد ذلك صراحة رمز المثال يعمل الآن.

شكرا له skeetness. للإجابة وإلى أنتون ماركوف للتعرض للنشالاس.

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

نصائح أخرى

من أ 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-F690C9358826/

هل حاولت إضافة كلمة رئيسية REF / OUT إلى C # الخارجية؟

هناك فكرة أخرى تحاول تمريرها في IntPTR بدلا من الفصل نفسه، أو اجتيازها في -As- INTPTR ...

أعتقد أن الهياكل يتم نسخها، وليس مرت بالرجوع افتراضي.

طعن بصدق في الظلام، لكن ليس لديك أي إجابات حتى الآن، لذلك نأمل أن يساعد ذلك ...

interop لا يزال في مرحلة "السحر" بالنسبة لي ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top