تنظيم مؤشر إلى مجموعة من الأنواع (إدارة C # -> C ++ غير المدارة)

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

  •  19-09-2019
  •  | 
  •  

سؤال

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

typedef struct
{
    short size;
    unsigned short** shortValues;
} UnmanagedStruct;

الذاكرة ل 'shortValues"مخصص داخل رمز غير مدار - حتى على الرغم من أن هذا الحقل هو ببساطة مؤشر إلى مجموعة من القيم القصيرة، تمت إضافة مستوى إضافي من غير مباشر بحيث يتم عرض الذاكرة المخصصة من قبل المتصل (التعليمات البرمجية المدارة) أيضا. ال 'sizeيمثل الحقل عدد العناصر في الصفيف. كيف يمكنني تمثيل هذا في التعليمات البرمجية المدارة؟

اعتقدت أنني سأمرها في IntPtr, ، ثم لم أستطع معرفة كيفية الوصول إلى القيم بمجرد عودة المكالمات غير المدارة.

هل كانت مفيدة؟

المحلول

هو رمز غير آمن موافق؟

public unsafe struct UnmanagedStruct
{
    public short size;
    public ushort** shortValues;
}

[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);

إذا كان لديك مؤشر إلى مجموعة من ushortس:

public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        ushort x = (*s.shortValues)[i];
        Console.WriteLine(x);
    }
}

إذا كان لديك مجموعة من الصفائف التي تم إنهاءها ب Null ushortس:

public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        for (ushort* p = s.shortValues[i]; p != null; p++)
        {
            ushort x = *p;
            Console.WriteLine(x);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top