سؤال

أحاول تمرير بنية من C# إلى مكتبة C++.أقوم بتمرير البنية ككائن، وتتوقعها الدالة C++ كمؤشر (باطل *).

أواجه مشكلة في تمرير الهيكل.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);

إليك نص استثناء وقت التشغيل الذي أحصل عليه:

"لا يمكن تنظيم "المعلمة رقم 1":مجموعة أنواع مُدارة/غير مُدارة غير صالحة (يجب إقران نوع القيمة هذا مع Struct)."

على الرغم من أنني وجدت مقالة MSDN تستخدم LPStruct في هذا السياق بالضبط.

هذا هو هيكلي الذي أحاول تنظيمه:

[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
    [MarshalAs(UnmanagedType.I4)]
    public int userParam1;
}

هذه هي وظيفة C++:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...
هل كانت مفيدة؟

المحلول

وحاول تمرير بنية كمعلمة المرجع.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);

عند استخدام المرجع جنبا إلى جنب مع هيكل، فإنه يمر من الناحية النظرية العنوان.

نصائح أخرى

صدفة، UnmanagedType.LPStruct نادرًا ما يكون صحيحًا، إن كان على الإطلاق MarshalAs دعوى. اقتباس من آدم ناثان من هو موظف مايكروسوفت:

يتم دعم UnmanagedType.LPStruct لحالة واحدة محددة فقط: التعامل مع نوع قيمة System.Guid كمعرف GUID غير مُدار مع مستوى إضافي من المراوغة.

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